Random.Next 确实有效,但不是 return 每个值

Random.Next does work, but it doesn't return every value

我最近开始编写字符随机发生器。当您在控制台中键入“hello”时,程序将混合这些字符并创建一个包含 H、E、L 和 O 的随机字符串。它应该与在控制台中键入的单词一样长,这意味着,如果您是输入 5 个字母的单词,我的程序也会 return 一个 5 个字母的字符串。

这是我的代码:

                string readLine = Console.ReadLine();

                int readLineLength = readLine.Length;

                Random r = new Random();
                char[] letters = readLine.ToCharArray();
                string randomString = "";

                for (int i = 0; i < readLineLength; i++)
                {
                    randomString += letters[r.Next(0, readLineLength)].ToString();
                }

                Console.WriteLine(randomString);
                Console.WriteLine("Press ENTER to generate a random constellation of letters.");

Random.Next 工作正常,但如果您输入单词“hello”,程序将只混合 E、L 和 O 而完全忽略 H。

我希望我的问题很清楚。

问题是您恰好随机忽略了 H,因为它不是在循环内选择的。要真正打乱数组,请使用 OrderBy from System.Linq:

进行排序
string readLine = Console.ReadLine();

Random r = new Random();
char[] letters = readLine.ToCharArray();
string randomString = string.Join("", letters.OrderBy(x => r.Next()));

Console.WriteLine(randomString);

@Adrian 回答的不错。然而,这里有一个替代方案,可能不太容易理解。


    string readLine = Console.ReadLine();
        int readLineLength = readLine.Length;
        Random r = new Random();
        var letters = new List<char>(readLine.ToCharArray());
        string randomString = "";
        for (int i = 0; i < readLineLength; i++)
        {
            int randomIndex = r.Next(letters.Count);
            randomString += letters[randomIndex].ToString();
            letters.RemoveAt(randomIndex);
        }

        Console.WriteLine(randomString);
        Console.WriteLine("Press ENTER to generate a random constellation of letters.");

听起来你想要的是随机播放提供的字符串,return是输入字符串的随机排列 .

例如,给定 hello,您可能 return 任何 - 甚至更多! — 的:

  • lohel
  • ohell
  • lehlo
  • 等等

简单地从字符串中随机挑选字符是行不通的。随机排序字符也不会。为什么?因为 11111 是一个完全合法的随机序列。

你想要的是随机算法Fisher-Yates 算法是最好的算法之一。

https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle