超过1个随机数序列c#,linq

时间:2010-12-04 12:57:27

标签: c# linq random sequence

我正在使用此代码生成随机数字序列:

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

3 个答案:

答案 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;
}

无法详细解释这个例子,我需要及时回过头来记住,但我不在乎;)