这是代码:
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是否有问题? 可能是它拼错了这个词,它是如何炒作之前的?所以也许我需要在代码中添加一些东西来保持字的加扰,直到这个字被扰乱,通过比较它原来直到这个单词被扰乱?
答案 0 :(得分:2)
查看Fisher–Yates shuffle algorithm并实现以下伪代码以实现元素的良好分布:
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
实例,生成的伪随机数本质上是重复的。这是由于在.NET框架中实现Random
类的方式。通过像您一样重用共享实例,可以避免这个问题。
但这不是问题所在。在您的算法中,您将选择两个随机数组元素并交换它们。很可能有一些数组元素永远不会以这种方式被选中。因此,当你完成时,很有可能某些元素不会改变它们在数组中的位置,这就是为什么它看起来并不好看。
答案 1 :(得分: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;
}