在二 帖子在Usenet上,数学家、统计学家、计算机科学家、华盛顿州立大学和佛罗里达州立大学教授George Marsaglia描述了一系列九个高质量的32位随机数生成器;参考资料页描述了各种生成器及其在各种情况下的优雅使用。它们在这里是C:
#定义znew(z=36969*(z&65535)+(z>>16))
#定义wnew(w=18000*(w&65535)+(w>>16))
#定义MWC((znew<<16)+wnew)
#定义SHR3(jsr^=(jsr<<17),jsr^=(jsr>>13),jsr ^=(jsr<<5))
#定义CONG(jcong=69069*jcong+1234567)
#定义FIB((b=a+b),(a=b-a))
#定义KISS((MWC^CONG)+SHR3)
#定义LFIB4(c++,t[c]=t[c]+t[UC(c+58)]+t[UC(c+119)]+t[UC(c+178)])
#定义SWB(c++,bro=(x<y),t[c]=(x=t[UC(c+34)])-(y=t[UC(c+19)]+bro))
#定义UNI(KISS*2.328306e-10)
#定义VNI((长)KISS)*4.656613e-10
#定义UC(无符号字符)/*转换操作*/
typedef unsigned long UL;
/*全局静态变量:*/
静态UL z=362436069,w=521288629,jsr=123456789,jcong=380116160;
静态UL a=224466889,b=7584631,t[256],x=0,y=0,bro;
静态无符号字符c=0;
/*使用KISS设置表格的步骤示例:*/
可设置无效(UL i1、UL i2、UL i 3、UL ii 4、UL iii、UL iv)
{整数i;z=i1;w=i2;jsr=i3;jcong=i4;a=i5;b=i6;
对于(i=0;i<256;i=i+1)t[i]=KISS;}
就我个人而言,我认为代码在外观上有点难看,但在内部绝对漂亮,非常优雅。Marsaglia还提供了一个测试套件,它应该在连续的行上打印七个零:
#包括<stdio.h>
int main(无效){
整数i;UL k;
可设置(123456543522112345998365195746118);
对于(i=1;i<100001;i++){k=LFIB4;}printf(“%u\n”,k-1064612766U);
对于(i=1;i<1000001;i++){k=SWB;}打印f(“%u\n”,k-627749721U);
对于(i=1;i<1000001;i++){k=KISS;}printf(“%u\n”,k-1372460312U);
对于(i=1;i<1000001;i++){k=CONG;}printf(“%u\n”,k-1529210297U);
对于(i=1;i<1000001;i++){k=SHR3;}打印f(“%u\n”,k-2642725982U);
对于(i=1;i<1000001;i++){k=MWC;}printf(“%u\n”,k-904977562U);
对于(i=1;i<1000001;i++){k=FIB;}打印f(“%u\n”,k-3519793928U);}
你的任务是把这九个随机数生成器翻译成你最喜欢的语言。完成后,欢迎您阅读或运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。
页:1 2