2024年6月12日发(作者:)
rand()
函数说明 :
因为rand的内部实现是用线性同余法做的,他不是真的随机数,只不过是因为
其周期特别长,所以有一定的范围里可看成是随机的,rand()会返回一随机数值,
范围在0至RAND_MAX 间。在调用此函数产生随机数前,必须先利用srand()
设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为
1。rand ()产生的是假随机数字,每次执行时是相同的。若要不同,以不同的值来
初始化它.初始化的函数就是srand()。
返回值:
返回0至RAND_MAX之间的随机整数值,RAND_MAX的范围最少是在32767
之间(int),即双字节(16位数)。若用unsigned int 双字节是65535,四字
节是4294967295的整数范围。
0~RAND_MAX每个数字被选中的机率是相同的。
rand()函数是产生随机数的一个随机函数。C语言里还有 srand()函数
等。
详述rand()
(1)使用该函数首先应在开头包含头文件stdlib.h
#include
(2)在标准的C库中函数rand()可以生成0~RAND_MAX之间的一个随机
数,其中RAND_MAX 是stdlib.h 中定义的一个整数,它与系统有关。
(3)rand()函数没有输入参数,直接通过表达式rand()来引用;例如可
以用下面的语句来打印两个随机数:
printf("Random numbers are: %i %in",rand(),rand());
(4)因为rand()函数是按指定的顺序来产生整数,因此每次执行上面的
语句都打印相同的两个值,所以说C语言的随机并不是真正意义上的随机。
(5)为了使程序在每次执行时都能生成一个新序列的随机值,我们通常
通过为随机数生成器提供一粒新的随机种子。函数 srand()(来自stdlib.h)
可以为随机数生成器播散种子。只要种子不同rand()函数就会产生不同的
随机数序列。srand()称为随机数生成器的初始化器。
例子
文件名: rand_srand.c
/* This program generates and prints ten random integers between
1 and RAND_MAX*/
#include
#include
int main()
{
unsigned int seed; /*申明初始化器的种子,注意是usigned int 型
的*/
int k;
printf("Enter a positive integer seed value: n");
scanf("%u",&seed);
srand(seed);
printf("Random Numbers are:n");
for(k = 1; k <= 10; k++)
{
printf("%i",rand());
printf("n");
}
return 0;
}
当提供的种子相同时,随机数序列也是相同的。而且当种子为1时,与
不使用srand()函数时一样的,也就是说rand()函数默认情况下初始化种子
值为1;
在stdlib.h 中这两个函数的原型是:
int rand();
void srand (unsigned int);
srand(time(0)); i=rand(); 这样i就是一个真正意义上的随机数。
rand()产生伪随机数,srand函数提供种子,种子不同产生的随机数序
列也不同,所以通常先调用srand函数 time(0)返回的是系统的时间(从
1970.1.1午夜算起),单位:秒,种子不同当然产生的随机数相同几率就
很小了。
范例
/* 产生介于1 到10 间的随机数值,此范例与执行结果可与rand()参照*/
#include
#include
main()
{
int i,j;
srand((int)time(0));
for(i=0;i<10;i++)
{
j=1+(int)(10.0*rand()/(RAND_MAX+1.0));
printf(" %d ",j);
}
}
执行:与rand范例比较
5 8 8 8 10 2 10 8 9 9
2 9 7 4 10 3 2 10 8 7
又或:
用"int x = rand() % 100;"来生成 0 到 100 之间的随机数这种方法是不或取的,
比较好的做法是: j=(int)(n*rand()/(RAND_MAX+1.0))产生一个0到n之间的随
机数
补充一点就是srand这个函数一定要放在循环外面或者是循环调用的外面,否则
的话得到的是相同的数字。
MSDN中的例子。
// crt_rand.c
// This program seeds the random-number generator
// with the time, then displays 10 random integers.
//
#include
#include
#include
int main( void )
{
int i;
// Seed the random-number generator with current time so that
// the numbers will be different every time we run.
//
srand( (unsigned)time( NULL ) );
// Display 10 numbers.
for( i = 0; i < 10;i++ )
printf( " %6dn", rand() );
printf("n");
// Usually, you will want to generate a number in a specific range,
// such as 0 to 100, like this:
{
int RANGE_MIN = 0;
int RANGE_MAX = 100;
for (i = 0; i < 10; i++ )
{
int rand100 = (((double) rand() /
(double) RAND_MAX) * RANGE_MAX + RANGE_MIN);
printf( " %6dn", rand100);
}
}
总结:
我们知道rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是
一个伪随机数,是根据一个数,我们可以称它为种了,为基准以某个递推公式推
算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了
随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,
除非你破坏了系统,为了改变这个种子的值,C提供了 srand()函数,它的原形
是void srand( int a) 功能是初始化随机产生器既rand()函数的初始值,即使把种
子的值改成a; 从这你可以看到通过sand()函数,我们是可以产生可以预见的随
机序列,那我们如何才能产生不可预见的随机序列呢?我们可能常常需要这样的
随机序列,是吧。利用srand((unsign)(time(NULL))是一种方法,因为每一次运
行程序的时间是不同的,对了,你知道time() 函数的功能是返回从1970/01/01
到现在的秒数的吧,可能这个起始时间不正确,你查一下对不对吧,C还提供了
另一个更方便的函数, randomize()原形是void randomize(),功能是用来始初
rand() 的种子的初始值,而且该值是不确定的,它相当于
srand((unsign)(time(NULL)) 不过应注意的是randomize()的功能要通过time来
实现所以在调用它时头文件要包含time.h罢了
发布评论