1

这是代码:

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;
}

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

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;
}

最后,List _scrambledWords 在每个索引中包含超过 1000 个字符串一个单词的字符串,其中大部分是加扰的,但其中一些与原始字符串中的相同。

问题是我的 MakeRandomwords 是否有问题?莫非是把字打乱了,就乱成原来的样子了?所以也许我需要在代码中添加一些东西来保持对单词的加扰,直到单词被加扰,直到单词被加扰为止?

4

2 回答 2

2

看一下Fisher-Yates shuffle 算法并实现以下伪代码以实现元素的良好分布:

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(),以防您想知道:如果您Random每次进入for循环时都实例化一个新实例,那么生成的伪随机数本质上将是相当重复的。这是由于Random类在 .NET 框架中实现的方式。通过像您一样重用共享实例,可以避免该问题。

不过,这不是这里的问题。在您的算法中,您选择两个随机数组元素并交换它们。很有可能有一些数组元素永远不会以这种方式被选中。因此,当您完成后,一些元素很有可能不会改变它们在数组中的位置,这就是为什么它看起来不太好洗牌的原因。

于 2013-06-29T13:23:58.697 回答
0

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

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;
}
于 2013-06-29T13:22:06.467 回答