安徽龙山建设网站广西建设厅网证书查询
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);  // 生成并返回随机数
}
