rand函数和srand函数都可以用来生成伪随机数。(用于模拟程序和玩游戏程序)
(1)rand函数——随机数发生器
每次调用rand函数,会返回一个0—RAND_MAX(<stdlib.h>中定义的宏)的数字。rand函数返回的数字是由“种子”产生的,所以实际上其返回的数值并不是真正的随机数。但对于偶然的观察者来说.rand函数似乎能产生不相关的数值序列。
用法:int rand(void) ;
(2)srand函数——初始化种子值
调用srand函数可以为rand函数提供种子值。如果在srand函数之前调用rand函数。那么会把种子值定为1。每个种子确定一个特定的伪随机序列,用户可以自己选择数值序列。
用法:void srand(unsigned int seed);
(3)time函数——产生和时间有关的随机种子
始终使用同一种子值会使得rand函数得到相同的数值序列,但是如果用户想模拟随机序列,即每次得到不同的序列,即必须使种子值“随机化”。最简单的方式是调用time函数。它返回一个对当前时间编码后得到的数值,并返回传递给srand函数,这样rand函数每次运行的时间都不相同。
用法:srand ((unsigned int) time (NULL));
(4)产生一定范围通用随机数范围的通用公式
要取得[a,b)的随机整数,使用(rand() % (b-a))+ a;
要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a;
要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1;
通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。
要取得a到b之间的随机整数,另一种表示:a + (int)b * rand() / (RAND_MAX + 1)。
要取得0~1之间的浮点数,可以使用rand() / double(RAND_MAX)。
下面看两个例子:
(1)测试伪随机序列生成函数
// Tests the pseudo-random sequence generation functions
#include
#include
int main(void) {
int i, seed;
printf("This program displays the first five values of rand.\n");
for (;;) {
for (i = 0; i < 5; i++)
printf("%d ", rand());
printf("\n\n");
printf("Enter new seed value(0 to terminate): ");
scanf_s("%d", &seed);
if (seed == 0)
break;
srand(seed);
}
getch();
return 0;
}
该程序首先返回rand函数的前5个值,然后用户选择新的种子值,遇到0程序结束。从运行程序结果来看,我们可知选择1为种子值和不指定种子值所得的数列相同。
(2)模拟“扎金花”游戏发牌,得到三张牌的结果(利用time函数生成随机种子)
// Tests the pseudo-random sequence generation functions
#include
#include
#include
#define Cards 12
#define Colors 4
int straight(int a[3]);
int main() {
int card[3];
int color[3];
srand((unsigned)time(NULL));
for (int i = 0; i < 3; i++) {
card[i]= rand() % Cards + 1;
color[i] = rand() % Colors + 1;
switch (color[i])
{
case 1: printf("The %d cards is spade %d\n", i+1,card[i]); break;
case 2: printf("The %d cards is heart %d\n", i+1, card[i]); break;
case 3: printf("The %d cards is club %d\n", i+1, card[i]); break;
case 4: printf("The %d cards is diamond %d\n", i+1, card[i]); break;
}
}
if ((color[0] == color[1]) && (color[1] == color[2]))
printf("golden flower !\n");
else if ((card[0] == card[1]) && (card[1] == card[2]))
printf("leaopord !\n");
else if ((card[0] == card[1]) || (card[1] == card[2]) || (card[0] == card[2]))
printf("pair !\n");
else if (straight(card) == 1)
printf("straight!\n");
else
printf("single!\n");
getch();
return 0;
}
int straight(int a[3]) {
int max=a[0], min=a[2];
for (int i = 0; i < 3; i++) {
if (a[i] > max){
max = a[i];
}
if (a[i] < min) {
min = a[i];
}
}
if (max - min == 2) { return 1; }
else { return -1; }
}