不同语言(即Java和C++)中的"随机"生成器如何比较?

Blu*_*ire 8 c++ java random

尽管标题很奇怪,但我想问一个合理的问题:哪个方法生成的数字更随机:Java的Random()Math.random()或者C++的rand()

我听说PHP rand()非常糟糕,即如果你映射它的结果你可以清楚地看到一个模式; 遗憾的是,我不知道如何用C++或Java绘制地图.

另外,只是出于兴趣,C#怎么样?

pax*_*blo 9

Java和C++都生成伪随机数,它们是:

  • 适合任何不是统计学家或密码学家的人(a) ; 要么
  • 对这两类人来说,这是不合适的.

老实说,除非你其中一个类,否则伪随机数生成器就可以了.

Java也SecureRandom声称提供加密类非确定性(我不能评论该论证的真实性),而且C++现在具有更多种类的随机数生成能力而不仅仅是rand()- <random>详情请参阅.

特定操作系统可以为随机数生成器提供熵源,例如CryptGenRandom在Windows下或/dev/random在Linux 下读取.或者,您可以通过使用随机事件(例如用户输入计时)来添加熵.


(a)实际上可能包含非统计学家或密码学家的其他工作类型的痕迹:-)

  • C++ 11中存在<random>头文件,它为发行版和随机数生成器提供了大量函数.所以对C++的支持似乎很强大.我不知道Java. (3认同)

Mic*_*rdt 5

java.util.Random(由内部使用Math.random())使用线性同余生成器,这是一个相当弱的RNG,但足以用于简单的事情.对于重要的应用程序,应该使用java.security.SecureRandom.

我不认为C或C++语言规范禁止使用该算法,rand()但大多数实现也使用LCG.C++ 11添加了新的API,可以产生更高质量的随机性.

  • 这在C++ 11中发生了重大变化.见[here](http://en.cppreference.com/w/cpp/numeric/random). (6认同)