首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我正在尝试随机打乱字符串,但是有些字符串根本没有被打乱,那会是什么呢?

我正在尝试随机打乱字符串,但是有些字符串根本没有被打乱,那会是什么呢?
EN

Stack Overflow用户
提问于 2013-06-29 21:11:13
回答 2查看 154关注 0票数 1

代码如下:

代码语言:javascript
复制
private static StringBuilder MakeRandomwords(string theWord)
{
    var jumbleSb = new StringBuilder();
    jumbleSb.Append(theWord);
    int lengthSb = jumbleSb.Length;
    for (int i = 0; i < lengthSb; ++i)
    {
        int index1 = (RandomGen.Next() % lengthSb);
        int index2 = (RandomGen.Next() % lengthSb);

        Char temp = jumbleSb[index1];
        jumbleSb[index1] = jumbleSb[index2];
        jumbleSb[index2] = temp;
    }
    return jumbleSb;
}

这是我用来构建乱码单词的列表:

代码语言:javascript
复制
private void GetText()
{
    _lengthaboveone = new List<string>();
    for (int i = 0; i < _words.Count; i++)
    {
        string word = _words[i];
        if (word.Length < 4) continue;

        string first = word.Substring(0, 1);
        string last = word.Substring(word.Length - 1, 1);
        string middle = word.Substring(1, word.Length - 2);
        _lengthaboveone.Add(middle);
        _words[i] = first + MakeRandomwords(middle) + last;
    }
    _scrambledWords = _words;
}

最后,列表_scrambledWords在每个索引中包含1000多个字符串,一个单词的字符串,其中大多数是乱码的,但也有一些与原始索引中的相同。

问题是我的MakeRandomwords是否出了什么问题?会不会是它把单词打乱了,然后又被打乱到原来的样子了?因此,也许我需要在代码中添加一些东西,它会一直将单词打乱,直到单词被打乱,将它与原始单词进行比较,直到单词被打乱?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-29 21:23:59

查看Fisher–Yates shuffle algorithm并实现以下伪代码,以实现元素的良好分布:

代码语言:javascript
复制
To shuffle an array a of n elements (indices 0..n-1):
    for i from n − 1 downto 1 do
        j ← random integer with 0 ≤ j ≤ i
        exchange a[j] and a[i]

为了详细说明Tim Schmelter询问RandomGen.Next()的评论,如果您一直在想:如果您每次进入for循环时都实例化一个新的Random实例,那么生成的伪随机数本质上是非常重复的。这是由于在.NET框架中实现Random类的方式造成的。通过像您一样重用共享实例,可以避免这个问题。

不过,这不是问题所在。在您的算法中,您将选取两个随机数组元素并交换它们。很可能有一些数组元素从未以这种方式被选择过。因此,当您完成时,很可能某些元素在数组中的位置不会改变,这就是为什么它看起来不是很好的混洗。

票数 2
EN

Stack Overflow用户

发布于 2013-06-29 21:22:06

不是随机交换两个位置,而是将每个位置交换到一个随机位置...它看起来更随机,因为每个元素都会移动。在你当前的设计中,有一些东西很可能永远不会移动。

代码语言:javascript
复制
for (int i = 0; i < lengthSb; ++i)
{
    int index1 = i;
    int index2 = (RandomGen.Next() % lengthSb);

    Char temp = jumbleSb[index1];
    jumbleSb[index1] = jumbleSb[index2];
    jumbleSb[index2] = temp;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17380571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档