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