导航技术论坛's Archiver

hg 发表于 2013-12-25 09:15

伪随机数生成算法及性能检验

[size=18px]什么叫伪随机数[/size][color=#000][font=Arial][size=14px][size=14px]        在一些问题中,比如计算机仿真和模拟、密码学等应用中,需要产生一个随机数数列来解决问题。[/size][/size][/font][/color]
[color=#000][font=Arial][size=14px][size=14px]        随机数数列分为真随机数数列和伪随机数数列。真随机数数列是完全不可预测的,可以通过放射性衰变、电子设备的热噪音、宇宙射线的触发时间等物理过程得到,但无法通过单纯的软件方式获得;伪随机数数列是可预测的,严格意义上不具有随机性质,通常用数学公式的方法获得。[/size][/size][/font][/color]
[color=#000][font=Arial][size=14px][size=14px]        由于很多应用当中对“随机”数列的要求并不十分严格,而且伪随机数的产生较真随机数更为廉价、高效,所以在大多数情况下只要产生统计分布较好的伪随机数数列就能够满足应用要求。早期的伪随机数生成算法以平方取中法为主,现在则以线性同余法为主要方式。下面我会就两种方式分别给出实例,并以数据统计和图形化的方式对伪随机数生成算法的性能进行检验。[/size][/size][/font][/color]
[color=#000][font=Arial][size=14px]
[/size][/font][/color]
[size=14px]种子[/size]
[font=Arial][size=14px][font=宋体][size=12pt]    正如数列需要有首项,产生伪随机数需要一个初值用来计算整个序列,这个初值被称为“种子”。种子可以是一个固定的值,也可以是根据当前系统状态确定的值。C语言用来产生伪随机数的库函数rand()的种子是固定的值,因此每次调用该函数产生的随机数数列都是相同的。所以为了获得随机性更好的数列,种子应为一个变量,该变量可以与当前系统时间、用户对键盘或鼠标操作情况有关。这里我将根据系统时间获得种子。[/size][/font][/size][/font]
[font=Arial][size=14px][font=宋体]代码如下:[/font][/size][/font]
[font=Consolas,][font=Verdana, Geneva, Arial, Helvetica, sans-serif][size=9px][b][cpp][/b] [url=http://blog.csdn.net/johnhany/article/details/8106564#]view plain[/url][url=http://blog.csdn.net/johnhany/article/details/8106564#]copy[/url][url=http://blog.csdn.net/johnhany/article/details/8106564#]print[/url][url=http://blog.csdn.net/johnhany/article/details/8106564#]?[/url][url=https://code.csdn.net/snippets/78469][img=12,12]https://code.csdn.net/assets/CODE_ico.png[/img][/url][url=https://code.csdn.net/snippets/78469/fork][img=12,12]https://code.csdn.net/assets/ico_fork.svg[/img][/url]
[/size][/font]

[list=1][*]#include <time.h>
[*]unsigned [b]long[/b] ssecond,nowtime;  [*] unsigned [b]long[/b] seed;  [*][b]long[/b] gettime()          //获得当前时间
[*]{  [*]    [b]time_t[/b] t;  [*]    time(&t);  [*]    [b]struct[/b]
[b]tm[/b] *local;  [*]    local=localtime(&t);  [*]    local->tm_mon++;  [*]    ssecond=([b]long[/b])local->tm_sec*100+local->tm_sec+36923;  [*]    nowtime=local->tm_sec + local->tm_min*100 + local->tm_hour*10000 + local->tm_mday*1000000 + local->tm_mon*100000000;  [*]    [b]return[/b] nowtime;  [*]}  [/list][/font]
[font=Arial][size=14px][font=宋体][size=12pt]在调用伪随机数生成函数之前通过seed=gettime();语句就完成了种子的初始化。[/size][/font][/size][/font]
[font=Arial][size=14px]
[/size][/font]
[font=宋体][size=12pt][size=14px]平方取中法[/size]
[/size][/font][font=Arial][size=14px][font=宋体][size=14px]平方取中法是由冯·诺依曼在[/size][/font][size=12pt]1946[/size][font=宋体][size=12pt]年提出的,其基本思想为:将数列中的第[/size][/font]a(i)[font=宋体][size=12pt]项(假设其有m[/size][/font][font=宋体][size=12pt]位)平方,取得到的[/size][/font]2m[font=宋体][size=12pt]位数(若不足[/size][/font]2m[font=宋体][size=14px]位,在最高位前补[/size][/font][size=12pt]0[/size][font=宋体][size=12pt])中间部分的[/size][/font]m[font=宋体][size=12pt]位数字,作为[/size][/font]a(i)[font=宋体][size=12pt]的下一项[/size][/font]a(i+1)[font=宋体][size=12pt],由此产生一个伪随机数数列。即:[/size][/font]
[/size][/font]
[font=Arial][size=14px]
[/size][/font]
[font=Arial][size=14px][font=宋体][size=12pt]x(i+1)=(10^(-m/2)*x(i)*x(i))mod(10^m)[/size][/font][/size][/font]
[font=Arial][size=14px]
[/size][/font]
[font=Arial][size=14px]
[/size][/font]
[font=Arial][size=12pt][font=宋体][size=12pt]平方取中法计算较快,但在实际应用时会发现该方法容易产生周期性明显的数列,而且在某些情况下计算到一定步骤后始终产生相同的数甚至是零,或者产生的数字位数越来越小直至始终产生零。所以用平方取中法产生伪随机数数列时不能单纯使用公式,应该在计算过程中认为加入更多变化因素,比如根据前一个数的奇偶性进行不同的运算,如果产生的数字位数减少时通过另一种运算使其恢复成m[/size][/font][font=宋体][size=12pt]位。[/size][/font][/size][/font]
[font=Arial][size=12pt][size=12pt]代码如下:[/size][/size][/font]
[font=Arial][size=14px]
[/size][/font]
[font=Consolas,][font=Verdana, Geneva, Arial, Helvetica, sans-serif][size=9px][b][cpp][/b] [url=http://blog.csdn.net/johnhany/article/details/8106564#]view plain[/url][url=http://blog.csdn.net/johnhany/article/details/8106564#]copy[/url][url=http://blog.csdn.net/johnhany/article/details/8106564#]print[/url][url=http://blog.csdn.net/johnhany/article/details/8106564#]?[/url][url=https://code.csdn.net/snippets/78469][img=12,12]https://code.csdn.net/assets/CODE_ico.png[/img][/url][url=https://code.csdn.net/snippets/78469/fork][img=12,12]https://code.csdn.net/assets/ico_fork.svg[/img][/url]
[/size][/font]

[list=1][*]//编译环境:Code::Blocks 10.05
[*]  //生成的数字范围为[0,LENGTH-1]
[*]  [b]long[/b] intlen([b]long[/b] in)        //整数in的长度
[*]  {  [*]      [b]long[/b] count=0;  [*]      [b]while[/b](in!=0)  [*]      {  [*]          in/=10;  [*]          count++;  [*]      }  [*]      [b]return[/b] count;  [*]  }  [*]  [b]long[/b] power_10([b]long[/b] in)      //10的in次幂
[*]  {  [*]      [b]long[/b] i,out=1;  [*]      [b]for[/b](i=0;i<in;i++)  [*]          out*=10;  [*]      [b]return[/b] out;  [*]  }  [*]  [b]long[/b] rand_pfqz([b]void[/b])      //平方取中
[*]  {  [*]      [b]long[/b] len;  [*]      [b]while[/b](seed<10000)          //保持数位一致
[*]          seed=seed*13+seed/10+second/3;  [*]      len=intlen(seed);  [*]      [b]long[/b] temp=seed;  [*]      temp=((seed*seed/power_10(len/2))%power_10(len));  [*]      [b]if[/b](temp%2==0)   temp+=second/3+7854;      //增加改变因素,
[*]      [b]else[/b]    temp+=second*second/2317;         //以延长计算周期
[*]      seed=temp;  [*]      [b]return[/b] (unsigned [b]long[/b])(seed%10000*LENGTH)/10000;  [*]  }  [/list][/font]

[font=Arial][size=12pt][font=宋体][size=12pt]以下为在5月18日11时12分43秒时刻以LENGTH=100产生的随机数数列:[/size][/font]
[/size][/font]
[font=Arial][size=14px]
[/size][/font]
[align=center][font=Arial][size=12pt]
[/size][/font][/align]
[align=left][align=center][color=#000][font=Arial][size=14px]93   12   7     4     70   32   95   97   25   8[/size][/font][/color][/align][/align][align=left][align=center][color=#000][font=Arial][size=14px]49   40   85   63   11   53   65   4     42   76[/size][/font][/color][/align][/align][align=left][align=center][color=#000][font=Arial][size=14px]33   1     34   88   31   37   79   1     62   97[/size][/font][/color][/align][/align][align=left][align=center][color=#000][font=Arial][size=14px]59   21   6     47   28   1     98   60   56   53[/size][/font][/color][/align][/align][align=left][align=center][color=#000][font=Arial][size=14px]61   48   47   31   8     54   53   15   54   67[/size][/font][/color][/align][/align][align=left][align=center][color=#000][font=Arial][size=14px]18   6     46   45   87   44   55   54   46   24[/size][/font][/color][/align][/align][align=left][align=center][color=#000][font=Arial][size=14px]74   12   68   41   97   18   27   86   13   81[/size][/font][/color][/align][/align][align=left][align=center][color=#000][font=Arial][size=14px]99   74   49   52   69   11   52   89   33   7[/size][/font][/color][/align][/align][align=left][align=center][color=#000][font=Arial][size=14px]73   22   1     95   19   89   57   21   77   90[/size][/font][/color][/align][/align][align=left][align=center][color=#000][font=Arial][size=14px]70   87   47   59   19   26   89   32   44   33[/size][/font][/color][/align][/align][align=center][font=Arial][size=12pt]

[/size][/font][/align]
[align=center][color=#000][font=Arial][size=14px]
[/size][/font][/color][/align]
[font=Arial][size=12pt][font=宋体][size=12pt]可见,该算法在连续计算100次时取到了0~99之间的65个不同的数。[/size][/font][/size][/font]
[font=Arial][size=12pt]
[/size][/font]
[font=Arial][size=14px]
[/size][/font]
[font=Arial][size=12pt][font=宋体][size=12pt]LENGTH=500,以连续产生的两个数字作为平面上点的横坐标与纵坐标,计算2000次,所得图形如下:[/size][/font][/size][/font]
[font=Arial][size=12pt][font=宋体][size=12pt][img]http://img.my.csdn.net/uploads/201210/24/1351058309_9475.jpg[/img]
[/size][/font][/size][/font]


[font=Arial][size=14px]
[/size][/font]
[font=Arial][size=14px]
[/size][/font]
[font=Arial][size=14px]
[/size][/font]
[size=18px]线性同余法[/size][color=#000][font=Arial][size=14px]
[font=宋体][size=12pt]  线性同余方法是目前应用广泛的伪随机数生成算法,其基本思想是通过对前一个数进行线性运算并取模从而得到下一个数。即:[/size][/font]
[font=宋体][size=12pt]a(i+1)=(a(i)*b+c)mod(m)[/size][/font]


[font=宋体][size=12pt]其中b[/size][/font][font=宋体][size=12pt]称为乘数,c[/size][/font][font=宋体][size=12pt]称为增量,m[/size][/font][font=宋体][size=12pt]称为模数,它们[/size][/font][font=宋体][size=12pt]均为常数。[/size][/font]

[/size][/font][/color]

[font=Arial][size=14px][font=宋体][size=12pt]乘数、增量和模数的选取可以多种多样,只要保证产生的随机数有较好的均匀性和随机性即可。[/size][/font]
[/size][/font]
[font=Arial][size=14px][font=宋体][size=12pt]线性同余法的最大周期是[/size][/font][font=宋体]m[/font][font=宋体][size=12pt],但一般情况下会小于[/size][/font][font=宋体]m[/font][font=宋体][size=12pt]。要使周期达到最大,应该满足以下条件:[/size][/font]
[/size][/font]
[font=Arial][size=14px][font=宋体][size=12pt](1) [/size][/font][font=宋体]c[/font][font=宋体][size=12pt]和[/size][/font][font=宋体]m[/font][font=宋体][size=12pt]互质;[/size][/font]
[/size][/font]
[font=Arial][size=14px][font=宋体][size=12pt](2) [/size][/font][font=宋体]m[/font][font=sans-serif][size=12pt]的所有质因子的[/size][/font][url=http://zh.wikipedia.org/wiki/%E7%A7%AF][color=#b080][font=sans-serif][size=12pt]积[/size][/font][/color][/url][font=sans-serif][size=12pt]能整除b-1;[/size][/font][/size][/font]
[font=Arial][size=14px][font=宋体][size=12pt](3) [/size][/font][font=宋体][size=12pt]若[/size][/font][font=宋体]m[/font][font=宋体][size=12pt]是4的倍数,则[/size][/font][font=宋体]b-1[/font][font=宋体][size=12pt]也是;[/size][/font]
[/size][/font]
[font=Arial][size=14px][font=宋体][size=12pt](4) [/size][/font][font=宋体]b[/font][font=宋体][size=12pt],[/size][/font][font=宋体]c[/font][font=宋体][size=12pt],[/size][/font][font=宋体]a(0)[/font][font=宋体][size=12pt](初值,一般即种子)都比[/size][/font][font=宋体]m[/font][font=宋体][size=12pt]小;[/size][/font]
[/size][/font]
[font=Arial][size=14px][font=宋体][size=12pt](5) [/size][/font][font=宋体]b[/font][font=宋体][size=12pt],[/size][/font][font=宋体]c[/font][font=宋体][size=12pt]是正整数。[/size][/font]
[/size][/font]
[font=Arial][size=14px]
[/size][/font]
[font=Arial][size=14px][font=宋体][size=12pt]在[/size][/font][font=宋体][size=12pt]C[/size][/font][font=宋体][size=12pt]和[/size][/font][size=12pt]VC[/size][font=宋体][size=12pt]中都定义有用于产生伪随机数的库函数[/size][/font][font=宋体][size=12pt]rand(),而且都是利用线性同余法产生伪随机数。[/size][/font]
[/size][/font]
[font=Arial][size=14px][font=宋体][size=12pt]在C中的rand()函数定义如下:[/size][/font][/size][/font]
[font=Consolas,][font=Verdana, Geneva, Arial, Helvetica, sans-serif][size=9px][b][cpp][/b] [url=http://blog.csdn.net/johnhany/article/details/8106564#]view plain[/url][url=http://blog.csdn.net/johnhany/article/details/8106564#]copy[/url][url=http://blog.csdn.net/johnhany/article/details/8106564#]print[/url][url=http://blog.csdn.net/johnhany/article/details/8106564#]?[/url][url=https://code.csdn.net/snippets/78469][img=12,12]https://code.csdn.net/assets/CODE_ico.png[/img][/url][url=https://code.csdn.net/snippets/78469/fork][img=12,12]https://code.csdn.net/assets/ico_fork.svg[/img][/url]
[/size][/font]

[list=1][*] #define RANDOM_MAX 0x7FFFFFFF  [*]  [b]static[/b]
[b]long[/b] do_rand(unsigned [b]long[/b] *value)  [*]  {  [*]      [b]long[/b] quotient, remainder, t;  [*]
[*]      quotient = *value / 127773L;  [*]      remainder = *value % 127773L;  [*]      t = 16807L * remainder - 2836L * quotient;  [*]      [b]if[/b] (t <= 0)  [*]      t += 0x7FFFFFFFL;  [*]      [b]return[/b] ((*value = t) % ((unsigned [b]long[/b])RANDOM_MAX + 1));  [*]  }  [*][b]static[/b] unsigned [b]long[/b] next = 1;  [*][b]int[/b] rand([b]void[/b])  [*]{  [*]   [b]return[/b] do_rand(&next);  [*]}  [*][b]void[/b] srand(unsigned [b]int[/b] seed)           //赋初值为种子
[*]{  [*]   next = seed;  [*]}  [/list][/font]

[font=Arial][size=14px][font=宋体][size=12pt]在[/size][/font][size=12pt]VC[/size][font=宋体][size=12pt]中[/size][/font][size=12pt]rand()[/size][font=宋体][size=12pt]函数定义如下:[/size][/font]
[/size][/font]
[font=Consolas,][font=Verdana, Geneva, Arial, Helvetica, sans-serif][size=9px][b][cpp][/b] [url=http://blog.csdn.net/johnhany/article/details/8106564#]view plain[/url][url=http://blog.csdn.net/johnhany/article/details/8106564#]copy[/url][url=http://blog.csdn.net/johnhany/article/details/8106564#]print[/url][url=http://blog.csdn.net/johnhany/article/details/8106564#]?[/url][url=https://code.csdn.net/snippets/78469][img=12,12]https://code.csdn.net/assets/CODE_ico.png[/img][/url][url=https://code.csdn.net/snippets/78469/fork][img=12,12]https://code.csdn.net/assets/ico_fork.svg[/img][/url]
[/size][/font]

[list=1][*][b]int[/b] __cdecl rand ([b]void[/b]) {       [b]return[/b](((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff);   }   [/list][/font]

[color=#000][font=Arial][size=14px]
[/size][/font][/color]
[font=Arial][size=14px][font=宋体][size=12pt][b]C[/b][b]程序设计语言(第二版)[/b](Brian W. Kernighan, Dennis M. Ritchie.)[/size][/font][size=12pt]中给出了一种适于[/size][size=12pt]C[/size][size=12pt]的[/size][size=12pt]rand()[/size][size=12pt]函数:[/size][/size][/font]
[font=Consolas,][font=Verdana, Geneva, Arial, Helvetica, sans-serif][size=9px][b][cpp][/b] [url=http://blog.csdn.net/johnhany/article/details/8106564#]view plain[/url][url=http://blog.csdn.net/johnhany/article/details/8106564#]copy[/url][url=http://blog.csdn.net/johnhany/article/details/8106564#]print[/url][url=http://blog.csdn.net/johnhany/article/details/8106564#]?[/url][url=https://code.csdn.net/snippets/78469][img=12,12]https://code.csdn.net/assets/CODE_ico.png[/img][/url][url=https://code.csdn.net/snippets/78469/fork][img=12,12]https://code.csdn.net/assets/ico_fork.svg[/img][/url]
[/size][/font]

[list=1][*]unsigned [b]long[/b] next=1;  [*][b]int[/b] rand([b]void[/b])  [*]{  [*]    next=next*1103515245+12345;  [*]    [b]return[/b] (unsigned [b]int[/b])(next/65536)%32768;  [*]}  [*][b]void[/b] srand(unsigned [b]int[/b] seed)  [*]{  [*]   next=seed;  [*]}  [/list][/font]

[color=#000][font=Arial][size=14px][size=14px]为了提高库函数rand()[font=宋体]的性能,可以通过以下函数进行再次运算产生数列:[/font][/size][/size][/font][/color]
[font=Consolas,][font=Verdana, Geneva, Arial, Helvetica, sans-serif][size=9px][b][cpp][/b] [url=http://blog.csdn.net/johnhany/article/details/8106564#]view plain[/url][url=http://blog.csdn.net/johnhany/article/details/8106564#]copy[/url][url=http://blog.csdn.net/johnhany/article/details/8106564#]print[/url][url=http://blog.csdn.net/johnhany/article/details/8106564#]?[/url][url=https://code.csdn.net/snippets/78469][img=12,12]https://code.csdn.net/assets/CODE_ico.png[/img][/url][url=https://code.csdn.net/snippets/78469/fork][img=12,12]https://code.csdn.net/assets/ico_fork.svg[/img][/url]
[/size][/font]

[list=1][*][b]int[/b] rrand([b]int[/b] n)  [*]{  [*]    [b]return[/b] 1+([b]int[/b])(n*rand()/(RAND_MAX+1));  [*]}  [/list][/font]

[color=#000][font=Arial][size=14px][size=14px]以下为LENGTH=100[font=宋体],利用[/font]C[font=宋体]的[/font]rand()[font=宋体]库函数产生的随机数序列:[/font][/size][/size][/font][/color]
[align=center][color=#000][font=Arial][size=14px][size=14px]41 67 34 0 69 24 78 58 62 64[/size][/size][/font][/color][/align]
[align=center][color=#000][font=Arial][size=14px][size=14px]5 45 81 27 61 91 95 42 27 36[/size][/size][/font][/color][/align]
[align=center][color=#000][font=Arial][size=14px][size=14px]91 4 2 53 92 82 21 16 18 95[/size][/size][/font][/color][/align]
[align=center][color=#000][font=Arial][size=14px][size=14px]47 26 71 38 69 12 67 99 35 94[/size][/size][/font][/color][/align]
[align=center][color=#000][font=Arial][size=14px][size=14px]3 11 22 33 73 64 41 11 53 68[/size][/size][/font][/color][/align]
[align=center][color=#000][font=Arial][size=14px][size=14px]47 44 62 57 37 59 23 41 29 78[/size][/size][/font][/color][/align]
[align=center][color=#000][font=Arial][size=14px][size=14px]16 35 90 42 88 6 40 42 64 48[/size][/size][/font][/color][/align]
[align=center][color=#000][font=Arial][size=14px][size=14px]46 5 90 29 70 50 6 1 93 48[/size][/size][/font][/color][/align]
[align=center][color=#000][font=Arial][size=14px][size=14px]29 23 84 54 56 40 66 76 31 8[/size][/size][/font][/color][/align]
[align=center][color=#000][font=Arial][size=14px][size=14px]44 39 26 23 37 38 18 82 29 41[/size][/size][/font][/color][/align]
[color=#000][font=Arial][size=12pt]可见,[/size][/font][/color][color=#000][font=Arial][size=12pt]该算法在连续计算[/size][/font][/color][color=#000][size=12pt]100[/size][/color][color=#000][font=Arial][size=12pt]次时取到了[/size][/font][/color][color=#000][size=12pt]0~99[/size][/color][color=#000][font=Arial][size=12pt]之间的[/size][/font][/color][color=#000][size=12pt]64[/size][/color][color=#000][font=Arial][size=12pt]个不同的数。[/size][/font][/color]
[font=Arial][size=14px][font=宋体][size=12pt]为了提高算法的均匀性,我找到了一种均匀度非常好的线性同余算法。C代码如下:[/size][/font][/size][/font]
[font=Consolas,][font=Verdana, Geneva, Arial, Helvetica, sans-serif][size=9px][b][cpp][/b] [url=http://blog.csdn.net/johnhany/article/details/8106564#]view plain[/url][url=http://blog.csdn.net/johnhany/article/details/8106564#]copy[/url][url=http://blog.csdn.net/johnhany/article/details/8106564#]print[/url][url=http://blog.csdn.net/johnhany/article/details/8106564#]?[/url][url=https://code.csdn.net/snippets/78469][img=12,12]https://code.csdn.net/assets/CODE_ico.png[/img][/url][url=https://code.csdn.net/snippets/78469/fork][img=12,12]https://code.csdn.net/assets/ico_fork.svg[/img][/url]
[/size][/font]

[list=1][*]
//编译环境:Code::Blocks 10.05
[*] //与平方取中法类似,种子根据当前系统时间获取
[*] unsigned [b]long[/b] nowtime;  [*]  unsigned [b]long[/b] seed;  [*] [b]long[/b] gettime()          //获得当前时间
[*] {  [*]     [b]time_t[/b] t;  [*]     time(&t);  [*]     [b]struct[/b]
[b]tm[/b] *local;  [*]     local=localtime(&t);  [*]     local->tm_mon++;  [*]     nowtime=local->tm_sec + local->tm_min*100 + local->tm_hour*10000 + local->tm_mday*1000000 + local->tm_mon*100000000;  [*]     [b]return[/b] nowtime;  [*] }  [*] #define LENGTH 100  [*] //生成的数字范围为[0,LENGTH-1]
[*][b]int[/b] rand_xxty([b]void[/b])     //线性同余法
[*]{  [*]    seed=(unsigned [b]long[/b])(seed*101+81)%LENGTH;  [*]    [b]return[/b] ([b]int[/b])seed;  [*]}  [/list][/font]

[color=#000][font=Arial][size=14px][size=14px]以下为在5[font=宋体]月[/font]18[font=宋体]日[/font]12[font=宋体]时[/font]51[font=宋体]分[/font]27[font=宋体]秒时刻以[/font]LENGTH=100[font=宋体]产生的伪随机数:[/font][/size][/size][/font][/color]
[align=center][color=#000][font=Arial][size=14px][size=14px]56 37 18 99 80 61 42 23 4 85[/size][/size][/font][/color][/align]
[align=center][color=#000][font=Arial][size=14px][size=14px]66 47 28 9 90 71 52 33 14 95[/size][/size][/font][/color][/align]
[align=center][color=#000][font=Arial][size=14px][size=14px]76 57 38 19 0 81 62 43 24 5[/size][/size][/font][/color][/align]
[align=center][color=#000][font=Arial][size=14px][size=14px]86 67 48 29 10 91 72 53 34 15[/size][/size][/font][/color][/align]
[align=center][color=#000][font=Arial][size=14px][size=14px]96 77 58 39 20 1 82 63 44 25[/size][/size][/font][/color][/align]
[align=center][color=#000][font=Arial][size=14px][size=14px]6 87 68 49 30 11 92 73 54 35[/size][/size][/font][/color][/align]
[align=center][color=#000][font=Arial][size=14px][size=14px]16 97 78 59 40 21 2 83 64 45[/size][/size][/font][/color][/align]
[align=center][color=#000][font=Arial][size=14px][size=14px]26 7 88 69 50 31 12 93 74 55[/size][/size][/font][/color][/align]
[align=center][color=#000][font=Arial][size=14px][size=14px]36 17 98 79 60 41 22 3 84 65[/size][/size][/font][/color][/align]
[align=center][color=#000][font=Arial][size=14px][size=14px]46 27 8 89 70 51 32 13 94 75[/size][/size][/font][/color][/align]
[color=#000][font=Arial][size=14px][size=14px]可见,该算法在连续计算100[font=宋体]次时取到了[/font]0~99[font=宋体]之间的所有的数。[/font][/size][/size][/font][/color]
[color=#000][font=Arial][size=14px]
[/size][/font][/color]
[font=Arial][size=14px][font=宋体][size=12pt]LENGTH=500,以连续产生的两个数字作为平面上点的横坐标与纵坐标,计算2000次,做出图形,可以看出该方法的特点,以及均匀性好的原因了:[/size][/font][/size][/font]
[font=Arial][size=14px][font=宋体][size=12pt][img]http://img.my.csdn.net/uploads/201210/24/1351059204_4213.jpg[/img]
[/size][/font][/size][/font]
[font=Arial][size=14px][font=宋体][size=12pt]从数据统计和所绘图形来看,该算法有极好的均匀性,但规律性较强,随机性较差,适合应用在对均匀度要求较高,而对随机性要求不高的问题中。[/size][/font]
[/size][/font]
[font=Arial][size=14px][font=宋体][size=12pt]以上给出的几种伪随机数生成算法各有优势,而且性能都能达到一般应用的要求,具有一定的实用价值。[/size][/font][/size][/font]

页: [1]

Powered by Discuz! Archiver 7.0.0  © 2001-2009 Comsenz Inc.