繁体   English   中英

超过1个随机数序列C#,Linq

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM