问题描述
背景:做一个抽奖程序,当时的随机算法没考虑太深,直接调用了newRandom().nextInt(totalNum);然后在测试的时候发现总共1000人左右,摇出的号很多集中在600-800之间,被人说黑幕,汗一个,查找资料,重新改随机数算法,总结如下,仅代表个人意见,欢饮大家讨论-------------------------------------java的Random类产生的随机数,不论是有种子还是无种子,不论是next()还是nextInt()还是...都是伪随机数,一般伪随机数,符合一定的正态分布,在某一个数字段内出现的概率会明显大于另一字段内的概率,我就很悲剧的遇上了,1000人抽选40人,600-800间的人大部分(抽了挺多次,都这样)后来改程序,自认为实现了逼真伪随机数,就是每次都以触发时的时间毫秒数为种子,产生一个newRandom(seed),再调用nextInt(totalNum),测试发现1000人抽选40的分布比较均匀了,基本每隔100的人数都差不多。逼真是因为多了一个不确定的时间毫秒数,从而使伪随即数也有了不确定性。至于真随机数,查找资料说是一般的计算机根本无法实现,因为一般计算机都用某种方法来创造一个随机数,这个方法肯定是确定的,所以肯定有个方法来推测出下一个随机数。(特殊计算机据说能实现)真正的随机数要实现,只能靠人脑,比如猜猜我现在想的1000内的数是多少,我在想的这个数才是真随机数。--------------------------------------欢饮各抒己见
解决方案
解决方案二:
有道理,计算机也是一个程序,是程序就一定会遵循某种规则,及时是产生随机数这样的东西也肯定是依靠了某种算法,只要知道了这个算法那么随机数可以推出来了
解决方案三:
该回复于2011-01-14 17:25:38被版主删除
解决方案四:
一般抽奖系统都应该有自己的抽奖算法,也就是逼真伪随机数,所以,免不了有幕后操作的
解决方案五:
你看一下Random的子类SecureRandom是否能满足你的要求?