随机数:完全随机生成的数,理论上存在,抽奖的时候需要使用。
伪随机数:一般都要通过一些算法得到一个伪随机数列。
连续多次调用rand可以得到伪随机序列
srand可以设置伪随机序列的种子。
#include<stdio.h>
#include <stdlib.h>
int main(void)
{
int ret = -1;
unsigned int seed = 0;
printf("RAND_MAX = %d\n", RAND_MAX);
srand(1);
ret = rand();
printf("seed = 1,rand is : %d\n", ret);
ret = rand();
printf("seed = 1,rand is : %d\n", ret);
srand(2);
ret = rand();
printf("seed = 2,rand is : %d\n", ret);
ret = rand();
printf("seed = 2,rand is : %d\n", ret);
seed = 12;
ret = rand_r(&seed);
printf("seed = 12,rand is : %d\n", ret);
seed = 15;
ret = rand_r(&seed);
printf("seed = 15,rand is : %d\n", ret);
return 0;
}
比较受局限的是每次得到的随机数是一样的,因为是一个种子生成的。这个算法是一定的,默认使用1作为种子,那么每次得到的序列是同一个,要想每次得到的伪随机数不同,解决方法就是换种子,使用srand设置种子。atoi字符转整形数
一般的做法是用time函数的返回值做srand的种子
#include<stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char **argv)
{
int ret = -1;
unsigned int seed = 0;
if(argc != 2)
{
printf("usage : %s num\n", argv[0]);
return -1;
}
printf("RAND_MAX = %d\n", RAND_MAX);
srand(atoi(argv[1]));
ret = rand();
printf("seed = 2,rand is : %d\n", ret);
srand(time(NULL));
ret = rand();
printf("time,rand is : %d\n", ret);
/*
seed = 12;
ret = rand_r(&seed);
printf("seed = 12,rand is : %d\n", ret);
seed = 15;
ret = rand_r(&seed);
printf("seed = 15,rand is : %d\n", ret);
*/
return 0;
}