函数:
rand
种类:
库函数、数学函数
用法:
格式:#include<stdlib.h>
int rand(void);
参数:rand()函数不接受参数,默认以1为种子(即起始值)
返回值:
伪随机整数
描述:
rand是一预定在头文件stdlib.h中的库函数,用于生成伪随机整数,所生成的伪随机整数的值介于零与RAND_MAX之间。RAND_MAX最小为37267。
范例:
- #include <stdio.h>
- #include <stdlib.h>
- int main()
- {
- int i,j;
- for(i=0;i<10;i++)
- {
- j=rand();
- printf("%d ",j);
- }
- return 0;
在笔者的机器里面,运行多次的结果,都为:
41 18467 6334 26500 19169 15724 11478 29358 26962 24464
注意事项:
随机数生成器总是以相同的种子开始,所以形成的伪随机数列也相同,失去了随机意义。(但这样便于程序调试)
二 : srand
函数: srand
种类:
库函数,数学函数
用法:
格式:#include<stdlib.h>
void srand(unsingnde int seed);
参数:seed——所要撒的“种子”值。
返回值:无
描述:
srand是一预定义在头文件stdlib.h中的库函数,用于为顺次调用rand函数所产生的伪随机数序列作初始化(撒下种子)。参数seed必须是个整数,通常可以利用time(0)的返回值来当做seed。(time函数稍后再讲。)
注:如果在调用rand函数之前未先调用srand函数,那么就相当于先调用函数srand(1)。
范例:
- #include <stdio.h>
- #include<stdlib.h>
- int main()
- {
- int i,j;
- srand(1);
- for(i=0;i<10;i++)
- {
- j=rand();
- printf("%d ",j);
- }
- return 0;
- }
在笔者的机器里面,运行的结果,和上面的范例是一样的,都为:
41 18467 6334 26500 19169 15724 11478 29358 26962 24464
(这是因为撒下的种子为“1”,和rand的默认种子一样)
注意事项:
如果用同样的变元(种子)值调用了srand函数,那么在其后多次对rand函数调用所产生的伪随机整数的序列是相同的。
产生不同的伪随机数。
如果种子相同,伪随机数列也相同。那么这样又要怎么产生伪随机数呢?一个办法是让用户输入种子,但是仍然不理想。另一个是用变化的数,比如时间来作为随机数生成器的种子。time的值每时每刻都不同。所以种子不同,所以,产生的随机数也不同。
范例:
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- int main(void)
- {
- int i=0;
- srand(time(0));
- for(i=0; i<10; i++)
- {
- printf("%d ",rand());
- }
- return 0;
- }
在笔者的机器里面,2次产生的结果为:
6442 3736 26247 23042 25067 26259 31013 16062 6454 24181
6625 15823 10833 27100 12859 16780 8702 15975 13599 7569
大家看到了,这个时候,产生的伪随机数就不相同了。
注意事项:
使用srand(time(0))来使用当前时间使随机数发生器随机化,这样就可以保证每两次运行时可以得到不同的随机数序列(只要两次运行的间隔超过1秒)。
rand函数使用的一些技巧:
由于rand产生的随机数从0到RAND_MAX,那么如何产生一个在自己控制范围之类的数呢?
对上面的代码进行下修改:
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- int main(void)
- {
- int i=0;
- int MAX=100;
- srand(time(0));
- for(i=0; i<10; i++)
- {
- printf("%d ",rand()%MAX);
- }
- return 0;
- }
查看产生的值,8,1,84,73,55,63,51,28,3,98
这个时候,产生的值都在100以内了。
总结一下:
a + rand() % n
其中的a是起始值,n是整数的范围。a + rand() % (b-a+1)
就表示 a~b之间的一个随机数
最后,说明下rand函数的原理
先前,一直强调rand产生的是一个伪随机数,为什么这么说呢?
rand是一个函数,函数顾名思义就是有输入、有输出,可是对于一个用if、for、while这些语句写出来算法来讲,如果输入是确定的,那么输出也就是确定的,这样的rand函数就无法生成随机数了,因为每次输出都是确定的。那么怎么能够实现输出不确定呢?计算机里变量等等值值都是一个固定的值,而只有系统时钟是不断变化的,因此srand的函数就是用来取当前系统时钟的值。然后保证每次调用rand产生的随机数序列是“不确定”的。因为这个“不确定”也是假的“不确定”,因为其实当前系统时钟的值也是一个可以算出来的值,所以我只要熟悉rand函数的内部实现,我就能猜出来每次调用rand函数产生的随机数是多少,这正是“伪随机”的意思。
在计算机中完全依靠软件算法是无法产生真正的随机数的,因为还是那句话,对于一个算法来讲“输入是确定的,那么输出也就是确定的”,要产生真正的随机数就要靠采集外部不确定的变量,比如使用一个探测器探测地磁场场强的变化、采集晶体管内热噪声的变化等等,这样才能产生真正的随机数。
- }