1.rand()函数
众所周知,C语言提供的rand()函数,实际上是根据srand(seed)产生的一种映射关系,一种简单的写法是这样的:
srand(((unsigned)time(NULL));
r = rand() % num;
这里time()函数返回的是从1970.01.01 00:00:00至今所经历的的秒数
2.弊端
由于返回的是秒数,所以我们可以想到,需要一下子产生一堆随机数的时候,rand()函数就吃瘪了。计算机执行一条语句花费时间很短,所以返回的秒数几乎没有什么差别,同时,rand函数实质上是一种映射关系,对于确定的输入一定有一个不变的输出与之对应,所以,我们应该将随机的重点放在随机数种子的生成上
3.改进
思路:人为控制seed变化
unsigned int seed = 0; //全局变量
int randNext(int left, int right)
{
seed++;
srand(seed);
return rand() % (right - left + 1) + left;
}
缺点:多次运行程序后会发现,产生了一样的结果
再次改进:加入随机成分
unsigned int seed = 0; //全局变量
int randNext(int left, int right)
{
seed++;
srand(time(NULL) + seed * seed);
return rand() % (right - left + 1) + left;
}
缺点:暴露了一个全局变量seed
再次改进:使用static封装
//返回[left, right]的随机数
int randNext(int left, int right)
{
static unsigned int seed = 0;
seed++;
srand((unsigned) time(NULL) + seed * seed);
return rand() % (right - left + 1) + left;
}