背景:做一个抽奖程序,当时的随机算法没考虑太深,直接调用了new Random().nextInt(totalNum);然后在测试的时候发现总共1000人左右,摇出的号很多集中在600-800之间,被人说黑幕,汗一个,查找资料,重新改随机数算法,总结如下,仅代表个人意见,欢饮大家讨论
-------------------------------------java的Random类产生的随机数,不论是有种子还是无种子,不论是next()还是nextInt()还是...都是伪随机数,一般伪随机数,符合一定的正态分布,在某一个数字段内出现的概率会明显大于另一字段内的概率,我就很悲剧的遇上了,1000人抽选40人,600-800间的人大部分(抽了挺多次,都这样)
后来改程序,自认为实现了逼真伪随机数,就是每次都以触发时的时间毫秒数为种子,产生一个newRandom(seed),再调用nextInt(totalNum),测试发现1000人抽选40的分布比较均匀了,基本每隔100的人数都差不多。逼真是因为多了一个不确定的时间毫秒数,从而使伪随即数也有了不确定性。
至于真随机数,查找资料说是一般的计算机根本无法实现,因为一般计算机都用某种方法来创造一个随机数,这个方法肯定是确定的,所以肯定有个方法来推测出下一个随机数。(特殊计算机据说能实现) 真正的随机数要实现,只能靠人脑,比如猜猜我现在想的1000内的数是多少,我在想的这个数才是真随机数。--------------------------------------
欢饮各抒己见