worse&better
军师
级别: 火花会员
编号: 42667
精华: 15
发帖: 9493
威望: 78 点
配偶: 单身
火 花 币: 0 HHB
注册时间:2005-08-16
最后登陆:2019-05-18
|
这段乱数生成的代码昨天讨论的时候算是基本弄明白了,开始时给m[m[0]], m[m[0]+2],m[m[0]+4]分别赋值为0x3671、0x90ea、0x1496然后根据那个算法计算(主要就是移位操作),最后的那句: r[0] = (r[0] * 100) >>> 16;
这个r[0]就是产生出的乱数;
实际上给定了m[m[0]], m[m[0]+2],m[m[0]+4]这3个量的初始值后,全部的乱数就是由这个算法得到的,可以肯定这个算法产生出的乱数其循环周期一定小于2^48;当然这已经是很大的数了,昨天拿程序测试时,确定这个周期肯定是大于1亿的,至于是多少应该无所谓了,基本上不可能耗到循环的。
PS:拿C编了个测试的小程序:
#include<stdio.h> #define NUM 10000
main() {
unsigned int m[3], ret; long i; FILE *fp; m[0]=0x3671; m[1]=0x90ea; m[2]=0x1496; fp=fopen("luanshu.txt", "w"); for(i=0; i<NUM; i++) { ret=(((m[0]>>5)+(m[1]<<11))^((m[2]<<1)+(m[1]>>15)))&0xffff; m[2] = m[1]; m[1] = m[0]; m[0] = ret; ret=((long)ret * 100) >> 16; fprintf(fp, "%d ",ret); if(i%20==19)fprintf(fp, "\n"); } }
把产生的乱数写到luanshu.txt这个文件当中,20个一行,有兴趣的可以玩一玩
|
The world combines after long separation, separates after long combination.
|
[61 楼]
|
Posted:2006-07-02 18:52| |
顶端
| |