簡體   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