[英]more than 1 sequence of random numbers c#, linq
我正在使用此代码生成数字的随机序列:
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
问题是您要在每次迭代中创建一个Random
新实例。 每个实例将从当前时间获取其初始种子,与您的委托执行的频率相比,该种子的变化相对不频繁。 您可以创建的单个实例Random
和重复使用它。 有关更多详细信息,请参见我的随机性文章 。
但是,我也建议您使用Fisher-Yates随机播放而不是OrderBy
来随机播放值(Stack Overflow上有很多示例,例如该示例)...尽管看起来您正在尝试偏向随机性。 如果您可以提供确切的详细信息,我们可能会提供更多帮助。
您将快速连续创建10个Random实例,并从每个实例中提取第一个伪随机数。 我并不奇怪他们都是一样的。
尝试这个:
Random r = new Random();
var sequence = Enumerable.Range(0, 9).OrderBy(n => n * n * r.Next());
在我的代码中,我使用了多年前编写的静态方法,它仍然显示出良好的随机性:
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;
}
无法详细解释此示例,我需要及时提醒自己,但我不在乎;)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.