【发布时间】:2015-10-15 13:30:30
【问题描述】:
我熟悉 Random 和 RNGCryptoServiceProvider 以及如何在 C# 中使用它们生成随机数。
但我也知道以下方法:
int start = 10;
int end = 50;
Enumerable.Range(start, end).OrderBy(o => Guid.NewGuid()).Take(5);
鉴于LINQ 的流媒体功能和此方法的给定线程安全性(而不是使用共享Random),我找不到不使用此方法的理由。
除了性能,我还缺少什么?
【问题讨论】:
-
即使在 Random 的情况下,它也将是线程安全的,因为不是并行 LINQ 查询。所以你可以用同样的方法使用 Random ,这取决于你想要什么随机数据 - 只是字节,或整个 guids
-
Sergey,我指的是更一般的情况,
sharing不同线程之间的随机对象。不过你是对的。 -
当
start和end有很大差异时,您需要生成和排序大集合 -
@Alexander,这不是真的,
LINQ的性质允许值被流式传输,因此没有排序或生成大集合,话虽如此,生成一个新的Guid对于结果Enumerable中的每个值,这可能并不理想。 -
@MaYaN 我不这么认为。如果不了解所有 it 元素,您将无法对集合进行排序。可惜我现在不能给出证明链接。