[英]Can I use LINQ to generate random numbers reliably in C#?
我熟悉Random
和RNGCryptoServiceProvider
以及如何將它們用於在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.