C++获取随机数的3种方式

简介

随机数的使用越来越广泛。

除了加密领域,在日常生活中也随处可见。如抽签、抽奖、测试等。

这里描述一个与Redis使用有关的场景:Redis过期时间的设置。

即建议对大批量的数据过期时间,设置一个值,并加上一个随机值,防止批量数据同时失效,造成缓存雪崩或影响性能。

c++11

c++11引入了头文件,用于生成随机数。它包括两个部分:

  • random engine: 生成随机的bit流
  • distribution: 生成满足用户需求的随机数

用法如下:

  • 使用seed初始化random engine,推荐std::random_device
    • 它每次运行都会生成不同的随机bit流
    • 如果要在每次启动时生成相同的序列,则需要用常量int初始化
  • 使用min-max范围值初始化distribution对象
c++11示例

下面直接上代码,使用 uniform_int_distribution 并输出10个1-100范围内的随机数字。

#include <iostream>
#include <random>

using std::cout;
using std::endl;

constexpr int MIN = 1;
constexpr int MAX = 100;

constexpr int RAND_NUMS_TO_GENERATE = 10;

int main()
{
    std::random_device rd;
    std::default_random_engine eng(rd());
    std::uniform_int_distribution<int> distr(MIN, MAX);

    for (int n = 0; n < RAND_NUMS_TO_GENERATE; ++n) {
        cout << distr(eng) << "; ";
    }
    cout << endl;

    return 0;
}

输出如下:

``

也可以指定random engine(不同的random engine具有不同的算法或性能差异)。

代码片断如下:

std::random_device rd;
std::mt19937 eng(rd());
std::uniform_int_distribution<int> distr(MIN, MAX);
c函数random

它的随机数质量可能不如前述,但在很多场合也够用了。

用法如下:

  • 以std::srand生成种子(一般以std::time(nullptr)为参数)
  • 调用rand生成随机数

代码如下:

#include <iostream>
#include <random>
#include <ctime>

using std::cout;
using std::endl;

constexpr int MIN = 1;
constexpr int MAX = 100;

constexpr int RAND_NUMS_TO_GENERATE = 10;

int main()
{
    std::srand(std::time(nullptr));
    for (int i = 0; i < RAND_NUMS_TO_GENERATE; i++)
        cout << rand() % MAX  << "; ";
    cout << endl;

    return 0;
}
小结

建议直接使用第一种代码示例,在大多数场景下是可以满足需求的。

当然,使用代码生成的随机数都是伪随机数,真正的密码领域需要使用硬件辅助了。

参考资料

Generate Random Number in Range in C++

  • 10
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值