尽管怪异的标题,我想问一个合理的问题:哪种方法的产生数量较多的随机 :Java的Random()
类或Math.random()
或者C ++的rand()
我听说PHP的rand()
是相当糟糕的,也就是说,如果你映射的结果,你可以清楚地看到一个模式; 可悲的是,我不知道如何在C ++或Java画地图。
而且,只是出于兴趣,那C#?
尽管怪异的标题,我想问一个合理的问题:哪种方法的产生数量较多的随机 :Java的Random()
类或Math.random()
或者C ++的rand()
我听说PHP的rand()
是相当糟糕的,也就是说,如果你映射的结果,你可以清楚地看到一个模式; 可悲的是,我不知道如何在C ++或Java画地图。
而且,只是出于兴趣,那C#?
Java和C ++生成的伪随机数,其要么是:
坦率地说,除非你是在这些类中的一个,伪随机数生成器的罚款。
Java也具有SecureRandom
如看来提供加密类非确定性(I不能对参数的真实性的评论)和C ++现在有一个更广泛的各种随机数生成能力的不仅仅是rand()
-见<random>
了解详情。
特定的操作系统可提供熵的源的随机数生成如CryptGenRandom
Windows或读取下/dev/random
Linux下。 或者,您可以通过使用随机事件,例如用户输入时间增加熵。
(一)实际上可能包含不统计学家或密码破译:-)其他作业类型的痕迹
java.util.Random
(其由在内部使用Math.random()
使用线性同余发生器 ,这是一个相当弱RNG,但足以为简单的事情。 对于重要的应用,应该使用java.security.SecureRandom
代替。
我不认为C或C ++语言规范禁止该算法使用rand()
但大多数实现使用LCG为好。 C ++ 11增添了新的API,产生较高质量的随机性。
有一个很好的文件,可以在网络上找到,由随机数生成器的全球专家之一完成。
这里是文件
该文件的第一部分是测试,你可能会跳过除非你的真正感兴趣的描述。 第27页,有许多发电机,包括Java,C ++,MATLAB,数学,Excel中,升压,......(他们在文中描述)不同的测试结果。
看来,爪哇发生器是一个好一点,但都没有跻身于世界上最好的。 从C ++ 11的MT19937已经好多了。
PHP使用的种子。 如果种子是在两个不同的时间相同,则rand()函数总是会输出同样的事情。 (可用于令牌例如很糟糕)。 我不知道C ++和Java,但没有真正的随机性,这使得质量难以评估。 安全musn't依靠这样的功能。
我不知道随机数是真正随机的任何语言的 - 我相信这样的事情存在,但总体来说,这是“你粘在种子,你会得到那个种子给出了序列”。 这是好的,如果你想使一个简单的“shootem行动”的游戏,基本的扑克游戏,轮盘模拟器适合于家庭使用,等等。但是,如果你有资金依靠游戏是真正随机的(例如,你给了钱基于特定序列的结果),或者你的秘密文件都是靠你的随机数,那么你肯定会需要一些其他的机制,寻找随机数。
而且还有周围的一些“真”随机数生成器。 他们不提供种子,所以基于什么号码,你上一次获得低预见性。 我不是说这是零,因为我不知道你可以得到甚至在未使用的无线频率,放射性衰变或任何采样无线电波genearing真正的随机数的最新方法。