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;
}
  • 14
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值