C语言中产生真随机数的方法,带封装

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;
}

你可能感兴趣的:(C)