我正在使用此代码生成随机数字序列:
var sequence = Enumerable.Range(0, 9).OrderBy(n => n * n * (new Random()).Next());
一切都还可以,直到我需要多个序列,在这段代码中我调用例程10次,结果是我的问题,所有序列都是相同的。
int i = 0;
while (i<10)
{
Console.Write("{0}:",i);
var sequence = Enumerable.Range(0, 9).OrderBy(n => n * n * (new Random()).Next());
sequence.ToList().ForEach(x=> Console.Write(x));
i++;
Console.WriteLine();
}
有人能给我一些实际生成不同序列的提示吗?希望使用LINQ
答案 0 :(得分:5)
问题是您在每次迭代时都在创建Random
的新实例。每个实例都将从当前时间获取其初始种子,与您的委托执行的频率相比,这种情况相对不频繁地发生变化。您可以创建Random
的单个实例并重复使用它。有关详细信息,请参阅我的article on randomness。
但是,我还建议您使用Fisher-Yates shuffle而不是OrderBy
来重新排列值(Stack Overflow上有很多示例,例如this one)。 ..虽然看起来你试图偏向于随机性。如果您可以提供有关完全您正在尝试做什么的更多详细信息,我们可能会提供更多帮助。
答案 1 :(得分:2)
您正在快速连续创建10个Random实例,并从每个实例中提取第一个伪随机数。我并不感到惊讶,他们都是一样的。
试试这个:
Random r = new Random();
var sequence = Enumerable.Range(0, 9).OrderBy(n => n * n * r.Next());
答案 2 :(得分:0)
在我的代码中,我使用了多年前写的静态方法,它仍然显示出良好的随机性:
using System.Security.Cryptography;
...
public static int GenerateRandomInt(int from, int to)
{
byte[] salt = new byte[4];
RandomNumberGenerator rng = RandomNumberGenerator.Create();
rng.GetBytes(salt);
int num = 0;
for (int i = 0; i < 4; i++)
{
num += salt[i];
}
return num % (to + 1 - from) + from;
}
无法详细解释这个例子,我需要及时回过头来记住,但我不在乎;)