作者sjgau (sjgau)
看板C_and_CPP
标题Re: [问题] 有关於乱数产生不重覆的问题
时间Mon Oct 3 10:31:39 2005
谈 乐透程式的乱数产生器
产生乱数的副程式是 乐透程式的关键,
可是,连XX银行,每个月的营业规模达
数十亿台币的乐透程式,他们的乱数也是
写得很烂。
不相信的话,请你花 一百元买两组电脑选号
的乐透,然後看看你拿到的号码,是否满意?
问题是出在,他们对於产生乱数的副程式
了解不够,写的不够好。
目前,全世界最经常被使用的产生乱数的副程式,
其数学公式如下
r(n)= (r(n-1)*a + b) mod c
第 n 个乱数,等於 前一个乱数,
乘以 a, 加上 b
把得到的结果,对 c 取余数
(a, b, c) 的选择,非常重要
IBM 建议使用
a= 16807, b= 0, c= 2147483647
另外一组被推荐的是
a= 48271, b= 0, c= 2147483647
※ 引述《DarkKiller (System hacked)》之铭言:
: 呃...
: ※ 引述《sjgau (sjgau)》之铭言:
: : 一 乱数产生器产生出来的乱数
: : 必须是 均匀分配,
: : 如果需要其他的统计分配,
: : 使用进一步的数学方法得之
: 没有人规定 Pseudo Random Number Generator 一定要是 Uniform Distribution,
: 实际上也的确有 Non-uniform PRNG。
: : 二 尽可能的 拥有最长的周期,
: 这在大多数的情况下是对的。
: : 在周期的循环之前,每一个可能的出现,
: : 必须确实出现
: : 譬如说,产生 1 - ((2^31) - 2)的乱数,
: : 以 67891 为种子数,
: : 在产生 下一个 6791 之前,必须 以上的每个数子
: : 都出现过 一次
: 但这是错的,cycle 要讲的东西不是这样。
: : 四 通常是 由时间函数取得乱数的种子数,
: : 但是,必须经过一些额外的处理,
: : 以免在短战的时间内,重复取得的时间函数值相同
: : 或是,过於接近
: 下面 <五> 的内容要移上来。
: : 五 产生的乱数,必须是 看起来不可预期
: : 不可以在每次开机的时候,有相同的乱数产生。
: : 不可以 每次产生都得到预期的结果。
: <五> 的标题跟内容无关。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 210.243.237.65
1F:推 renderer:推 10/03 11:35
2F:推 simata:请大大来M起来..太重要了... 10/04 00:23
3F:推 drkkimo:这是线性同余法 这不是什麽了不起的秘密吧 10/04 20:44