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
- 等等
简单地从字符串中随机挑选字符是行不通的。随机排序字符也不会。为什么?因为 1
• 1
• 1
• 1
• 1
是一个完全合法的随机序列。
你想要的是随机算法。 Fisher-Yates 算法是最好的算法之一。
我最近开始编写字符随机发生器。当您在控制台中键入“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
- 等等
简单地从字符串中随机挑选字符是行不通的。随机排序字符也不会。为什么?因为 1
• 1
• 1
• 1
• 1
是一个完全合法的随机序列。
你想要的是随机算法。 Fisher-Yates 算法是最好的算法之一。