随机数
C语言产生随机数要用到rand()函数和srand()函数。random()函数不遵循ANSI C 标准,再gcc、VC等编译器下不能通过编译。
(1)若是为了生成一个无范围限制的随机数,只需用rand()函数即可。rand()函数会返回一个随机数,范围是0~RAND_MAX。RAND_MAX定义在stdio.h中,其值为2147483647。
(2)如果要生成某个范围内的随机数,一般分两种情况:
第一种是从0开始的随机数,比如要生成0~10的随机数,利用rand()函数对11取余,即rand()%11;
第二种是不从0开始的随机数,比如要生成范围是5-25的随机数,利用rand()函数对25-5+1=21取余再加上5,即rand()%21+5。
(3)以上两种情况生成的随机数都是一次性的,以后无论再运行多少次,输出结果都将与第一次相同。为了使程序在每次执行时都能生成一个新序列的随机值,需要为随机数生成器提供一粒新的种子。此时需要用到srand()函数,该函数可以为随机数生成器播散种子。只要种子不同,rand()函数就会产生不同的随机数序列。srand()称为随机数生成器的初始化器。其函数原型为:
void srand (unsigned int seed);
该函数中的参数seed是种子,用来初始化rand()的初始化rand()的起始值。其功能为:从srand(seed)中所指定的seed开始,返回一个在[0,RAND_MAX]之间的随机整数。rand()函数是真正的随机数产生器,srand()函数为rand()函数提供随机数种子。srand((unsigned int) time (NULL));表示使用系统定时器的值作为随机数种子。
系统在调用rand()函数之前都会自动调用srand()函数,如果用户在调用srand()函数,如果用户在调用rand()函数之前没调用过srand()函数,那么系统会默认将1作为伪随机数的初始值。如果用户在调用rand()函数之前曾经调用过srand()函数,并给参数seed赋了一个值,那么rand()函数就会将此值作为产生随机数的初始值。如果给seed一个固定值,那么每次rand()函数产生的随机数都将是一样的。
我们通常使用系统时间来进行初始化,即使用time()函数获取系统时间,它的返回值是time_t类型的,要转化为unsigned int 类型之后再传给srand()函数。另外,如果使用time(),还需要加入头文件“time.h”
在使用time()函数时,其函数一般为NULL,即直接传入空指针即可。如果觉得时间间隔太小,可以乘上合适的整数,比如srand((unsigned int)time(NULL)*5).
[案例7]掷骰子
小时候玩游戏经常会用到骰子,骰子占据了童年记忆的一部分,它虽然很小,但是作用极大。今天也要玩一个关于掷骰子的游戏,规则为: 一盘游戏中,两人轮流掷骰子5次,并将每次掷出的点数累加,5局之后,累计点数较大者获胜,点数相同则为平局。案例要求通过编程算出50盘之后的胜利者( 50盘中赢的盘数最多的,即最终胜利者)。
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main()
{
srand((unsigned int)time(NULL));
// rand();
int d1,d2,c1,c2,i,j;
for(i = 1; i <= 50; i++)
{
d1 = d2 = 0;
for(j = 1; j <= 6; j++)
{
d1 = d1 + rand()%6 + 1;
d2 = d2 + rand()%6 + 1;
}
if(d1 > d2)
c1++;
else if(d1 < d2)
c2++;
}
if(c1 > c2)
{
printf("\n The first win.");
}
else
{
if(c1 < c2)
printf("\n The second win.");
else
printf("\n They tie.");
}
return 0;
}