如何正确地生成一个随机数
Posted Jozky86
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何正确地生成一个随机数相关的知识,希望对你有一定的参考价值。
参考文章
笔记 | 如何正确地生成一个随机数
CF曾提到:Don’t use rand(): a guide to random number generators in C++
文章总结:
1 .rand()的随机范围太小了,在某些平台下(例如 Windows)RAND_MAX 只有 32768。如果需要的范围大于 32768,那么指定 min 和 max 参数就可以生成大于 RAND_MAX 的数了,或者考虑用 mt_rand() 来替代它。
2. random_shuffle(打乱数组顺序)
3. rand()使用的伪随机算法是 linear congruential generator (线性同余发生器),在低位循环节很低
rand()不行那咋办?文章中给了东西:mt19937(范围:无限制,可以自己设定),mt19937是c++11中加入的新特性,具有速度快,周期长的特点
无范围:
使用方法:
#include<random>
#include<ctime>
std::mt19937 rnd(time(0));
int main()
{
printf("%lld\\n",rnd());
return 0;
}
C++无范围限制
#include <iostream>
#include <chrono>
#include <random>
using namespace std;
int main()
{
// 随机数种子
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
mt19937 rand_num(seed); // 大随机数
cout << rand_num() << endl;
return 0;
}
手动加上范围:
#include <iostream>
#include <chrono>
#include <random>
using namespace std;
int main()
{
// 随机数种子
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
mt19937 rand_num(seed); // 大随机数
uniform_int_distribution<long long> dist(0, 1000000000); // 给定范围
cout << dist(rand_num) << endl;
return 0;
}
以上是关于如何正确地生成一个随机数的主要内容,如果未能解决你的问题,请参考以下文章