random
完整文档看这里
三步走:
- 选择一种随机数种子
- 选择一个随机数引擎
- 选择一个随机数分布
- 输出
随机数种子
//生成随机数种子,在Linux的实现中,是读取/dev/urandom设备
std::random_device rd;
unsigned seed1 = rd();// 获取当前时间点作为随机数种子
unsigned seed2 = std::chrono::system_clock::now().time_since_epoch().count();
随机数引擎
名称 | 说明 |
---|---|
default_random_engine | 别名,取决于编译器把某个引擎与其关联, |
std::linear_congruential_engine std::minstd_rand0、std::minstd_rand | 线性同余引擎 |
std::mersenne_twister_engine std::mt19937、std::mt19937_64 | Mersenne Twister引擎、梅森旋转算法 |
std::subtract_with_carry_engine std::ranlux24_base 、std::ranlux48_base | 实现带进位减(一种延迟斐波那契)算法 |
随机数分布
有很多种 均匀分布、伯努利分布、泊松分布、正态分布、采样分布等等
日常开发中,均匀分布用的比较多,随机抽样、模拟掷骰子、简单的游戏随机数生成时,均匀分布非常常见
均匀分布
std::uniform_int_distribution
正态分布
normal_distribution
总结
建议优先使用
- random_device 生成随机数种子
- 随机数引擎 使用 mt19937
- 随机数分布采用 均与分布
- 然后这些只是普通用用就好,涉及到加密安全领域,请使用加密安全库(例如: OpenSSL 库)。
上代码
#include <iostream>
#include <random>
using namespace std;int main()
{// 生成随机数种子std::random_device rd;//梅森旋转算法std::mt19937 mt(rd());//均匀分布std::uniform_int_distribution dis(1, 100);for(int i=0;i<10;i++){std::cout<<dis(mt)<<endl;}return 0;
}
如果需要封装成函数可以这样写:
#include <random>int mt_rand(int min, int max) {static std::random_device rd; // 静态随机数种子static std::mt19937 mt(rd()); // 静态梅森旋转引擎,只初始化一次std::uniform_int_distribution<int> dis(min, max); // 均匀分布return dis(mt); // 生成并返回随机数
}