簡體   English   中英

我可以使用LINQ在C#中可靠地生成隨機數嗎?

[英]Can I use LINQ to generate random numbers reliably in C#?

我熟悉RandomRNGCryptoServiceProvider以及如何將它們用於在C#中生成隨機數。

但我也知道以下方法:

int start = 10;
int end = 50;
Enumerable.Range(start, end).OrderBy(o => Guid.NewGuid()).Take(5);

考慮到LINQ的流傳輸能力和該方法的給定線程安全性(與使用共享Random相對),我找不到不使用此方法的原因。

除了性能,我還缺少什么?

Guid類旨在創建唯一的數字,而不是隨機的數字。

不能保證您將獲得均勻的分布。 對於與加密相關的任務,它肯定不安全。

只需使用最適合特定任務的類即可。 隨機用於快速偽隨機數據,而RNGCryptoServiceProvider用於安全性。

Linq方法是一個hack。 如果遇到線程問題,請以既定方式使其成為線程安全的。

如果您想使用linq接口,我建議這樣:

public IEnumerable<int> GetRandomSequence(int start, int end)
{
    var generator = new Random();

    while (true)
        yield return generator.Next(start, end);
}

接着

var randomSequence = GetRandomSequence(10, 50).Take(5);

但是使用計數器而不是“ while(true)”會更安全,這樣可以避免無休止的循環:

var sequence = GetRandomSequence();
var someOtherSequence = sequence.Skip(5); // here we forget to call Take, Zip, TakeWhile etc.
// some code
var someVar = someOtherSequence.ToList(); // endless call here
var someOtherVar = someOtherSequence.Join( ... ) // and here

您的技術的問題(或可能有好處?)是它不會在范圍內重復任何數字。

在真正的隨機集中,您可能會合理地看到偶爾重復的數字。

示例: {12, 46, 12, 27, 12}應該是有效輸出。

使用您的方法,您將再也看不到12
如果要以隨機順序返回10-50的數字,但每個數字僅返回一次,那么您確實需要一種改組算法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM