C# 我正在尝试随机乱串字符串,但有些字符串是';我一点也不慌张那会是什么?

C# 我正在尝试随机乱串字符串,但有些字符串是';我一点也不慌张那会是什么?,c#,C#,代码如下: 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 = (Rando

代码如下:

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 static StringBuilder生成随机词(string theWord)
{
var jumbleSb=新的StringBuilder();
附加(单词);
int lengthSb=巨型长度;
对于(int i=0;i
这是我用来构建加扰词的列表:

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;
}
private void GetText()
{
_lengthaboveone=新列表();
对于(int i=0;i<\u words.Count;i++)
{
字符串字=_字[i];
如果(字长<4)继续;
第一个字符串=字。子字符串(0,1);
字符串last=word.Substring(word.Length-1,1);
字符串中间=word.Substring(1,word.Length-2);
_加上(中间);
_单词[i]=第一个+第二个单词(中间)+最后一个;
}
_加扰词=_单词;
}
最后,列表中的加扰词在每个索引中都包含1000多个字符串——一个词的字符串——大多数都加扰了,但其中一些保留了原来的字符串

问题是我的话是否有问题?
可能是它把这个词弄乱了,它被弄乱了,变成了以前的样子?因此,也许我需要在代码中添加一些东西,通过将单词与原始单词进行压缩直到单词被置乱,从而使单词一直置乱?

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

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;
}
for(int i=0;i
查看并实现以下伪代码,以实现元素的良好分布:

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 framework中实现了
Random
类的方式造成的。通过像您这样重用共享实例,可以避免该问题


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

在哪里声明和初始化了
RandomGen
RandomGen?声明了RandomGen,并在构造函数前面的Form1顶部初始化:private static readonly RandomGen=new Random()当然,不加扰的字符串有4个以上的字符,请考虑只在一个单词上调用两个字符。每次生成<代码>索引x和<代码>索引x2>代码>,它们将相等或相反。如果它们相等,则不发生交换。如果它们是相反的,则交换字母。交换次数发生时,无论你运行多少次迭代,你都会在输入时得到相同的单词。对于较长的单词,会有类似的交换序列,最终将所有字母放回起始位置。如果你随机对一个4个字母的单词进行置乱,则与原始单词相同的几率为1/24。对于一个5个字母的单词换句话说,有120分之一的几率是相同的。所以即使有一个完美的扰码器,你仍然会得到不变的字符串。