如何正确地生成一个随机数

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;
}


以上是关于如何正确地生成一个随机数的主要内容,如果未能解决你的问题,请参考以下文章

在java语言中如何随机地生成一个字符串

如何最好地为网站生成随机盐?

如何正确更新 cookie?

17 | 如何正确地显示随机消息?

17 | 如何正确地显示随机消息?

函数模板未正确生成随机数