可以移植的随机数生成程序

ANSI C标准委员会的随机数生成算法:

I[j+1] = a * I[j] + c (mod m)  (c != 0)                  (1)

a = 1103515245,c = 12345,m = 2^32

优点:速度快、每次调用的运算量小

缺点:连续调用不能避免序列的相关性

 

Park和Miller的简单的乘法同余算法:

I[j+1] = a * I[j] (mod m)                                     (2)

选择的最低标准:(选择适当的选择a和m的值,可以与(1)中的c!=0生成程序一样好)

以下a和m的选择为Park和Miller提出:

a = 7^5 = 16807  m = 2^31 - 1 = 2147483647 (3)

理论证明是“完美的”可是高级语言直接实施(2)和(3)是不可能的。因为a和m-1的乘积超过了32位整数的最大值。虽然汇编中可以使用64位乘积寄存器实现,可是机器与机器之间的不可移植。于是Schrage提出了一个实现的诀窍:基于m的“近似因子分解”:

m = aq + r 即: q = [m/a],r = m mod a (方括号表示整数部分)    (4)

若r很小,特别是r < q且 0 < z < m - 1,则可以看出a(a mod q)和r[z/q]都处在0,...,m - 1范围内,且

az mod m = a(z mod q) - r[z / q]    如果>=0

                   a(z mod q) - r[a / q] + m 其他

对(4)式中的q = 127773和r = 2836

可以得出最低标准生成程序如下:

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bill Adams

喜欢?打赏一杯阔乐吧!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值