作业帮 > 综合 > 作业

有什么办法可以确定一组数是随机数或者不是随机数

来源:学生作业帮 编辑:拍题作业网作业帮 分类:综合作业 时间:2024/05/16 03:42:56
有什么办法可以确定一组数是随机数或者不是随机数
大家可能很多次讨论过随机数在计算机中怎样产生的问题gko在这篇文章中,我会对这个问题进行更深入的探讨,阐述我对这个问题的理解.  首先需要声明的是,计算机不会产生绝对随机的随机数,计算机只能产生“伪随机数”.其实绝对随机的随机数只是一种理想的随机数,即使计算机怎样发展,它也不会产生一串绝对随机的随机数.计算机只能生成相对的随机数4即伪随机数.  伪随机数并不是假随机数,这里的“伪”是有规律的意思,就是计算机产生的伪随机数既是随机的又是有规律的.怎样理解呢?产生的伪随机数有时遵守一定的规律,有时不遵守任何规律;伪随机数有一部分遵守一定的规律;另一部分不遵守任何规律386比如“世上没有两片形状完全相同的树叶”gk这正是点到了事物的特性,即随机性,但是每种树的叶子都有近似的形状,这正是事物的共性,即规律性.从这个角度讲,你大概就会接受这样的事实了:计算机只能产生伪随机数而不能产生绝对随机的随机数.  那么计算机中随机数是怎样产生的呢?有人可能会说,随机数是由“随机种子”产生的w没错,随机种子是用来产生随机数的一个数,在计算机中,这样的一个“随机种子”是一个无符号整形数.那么随机种子是从哪里获得的呢?下面看这样一个C程序://rand01.c#includestatic unsigned int RAND_SEED;unsigned int random(void){    RAND_SEED=(RAND_SEED*123+59)%65536;    return(RAND_SEED);}void random_start(void){int temp[2];movedata(0x0040,0x006c,FP_SEG(temp),FP_OFF(temp),4);RAND_SEED=temp[0];}main(){    unsigned int i,n;    random_start();    for(i=0;i<10;i++)        printf("%u\t",random());    printf("\n");}这个程序(rand01.c)完整地阐述了随机数产生的过程:首先,主程序调用random_start()方法,random_start()方法中的这一句我很感兴趣:    movedata(0x0040,0x006c,FP_SEG(temp),FP_OFF(temp),4);这个函数用来移动内存数据,其中FP_SEG(far pointer to segment)是取temp数组段地址的函数eimqFP_OFF(far pointer to offset)是取temp数组相对地址的函数,movedata函数的作用是把位于0040:006CH存储单元中的双字放到数组temp的声明的两个存储单元中.这样可以通过temp数组把0040:006CH处的一个16位的数送给RAND_SEED.random用来根据随机种子RAND_SEED的值计算得出随机数,其中这一句:    RAND_SEED=(RAND_SEED*123+59)%65536;是用来计算随机数的方法,随机数的计算方法在不同的计算机中是不同的,即使在相同的计算机中安装的不同的操作系统中也是不同的.我在linux和windows下分别试过相同的随机种子在这两种操作系统中生成的随机数是不同的,这说明它们的计算方法不同.......余下全文>>