一尘不染

如何使用C#生成真正的(非伪)随机数?

algorithm

我知道Random类可以生成伪随机数,但是有没有一种方法可以生成真正的随机数?


阅读 457

收藏
2020-07-28

共1个答案

一尘不染

这里的答案有两个主要方面。您应该适当注意一些非常重要的细节。

简易方法(出于简单性和实用性)

RNGCryptoServiceProvider,这是在BCL的加密API的一部分,应该为你做的工作。从技术上讲,它仍然是一个伪随机数,但是“随机性”的质量要高得多-
顾名思义,它适用于加密目的。

还有其他具有高质量伪随机生成器的低温API。诸如Mersenne扭曲器之类的算法非常流行。

RandomBCL中的类相比,它要好得多。Random例如,如果在图表上绘制由生成的数字,则您应该能够识别模式,这是弱点的有力标志。这主要是由于该算法仅使用固定大小的种子查找表。

艰难的道路(用于高质量的理论随机性)

要生成 真正的
随机数,您需要利用一些自然现象,例如核衰变,微观温度波动(CPU温度是一个相对方便的来源),仅举几例。但是,这要困难得多,并且当然需要附加的硬件。我怀疑实际的解决方案(RNGCryptoServiceProvider或类似的解决方案)应该为您做得很好。

现在,请注意,如果 确实需要真正的随机数 ,则可以使用 Random.org之类
的服务,该服务会生成具有非常高的随机性/熵(基于 大气噪声
)的数字。数据可免费下载。尽管这确实为您提供了适合科学研究的数据,但对于您的情况,这可能不必要地变得复杂。

最终由您选择,但至少现在您应该能够了解RNG的各种类型和级别,从而做出有意义的决定。

2020-07-28