看这个的默认了解基础的随机数生成。
c标准随机数方法
使用经典线性同余算法(linear congruential method),大部分随机数的生成使用这种方法,经典代码如下:
#include <iostream>
#include <cstdio>
#include <random>
#include <ctime>
using namespace std;
int main(){
srand(time(0));
cout<<rand()<<endl;
return 0;
}
其中srand()传入种子为 unsigned int 类型,随机数种子的最小单位为秒,注意如果使用时间作为种子时,要让不同的随机数生成间隔超过一秒,或者自己生成随机数。
本方法现在通常作为随机数种子生成器。
生成范围:0~32767(2^15)
C++(random)
mt19937(c11)
使用梅森旋转生成器,属于"mersenne_twister_engine"内容,由于是最为常用的随机数生成器,因此首先介绍。
梅森旋转生成器19937来自于周期预估长度高达19937位,理论足够包含整个宇宙粒子数,因此发明者骄傲的命名为19937,mt为Mersenne Twister的简写。用于生成32位大小的随机数,c++同时提供了64位的生成方法mt19937_64。其中19937为梅森素数,恰好位于第24位,也即2^19937 - 1 为梅森素数。这项成果被发表在1971年的一篇文章中。
简单例子:
#include <iostream>
#include <cstdio>
#include <ctime>
#include <random>
using namespace std;
int main(){
random_device rd; //Will be used to obtain a seed for the random number engine
mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
uniform_int_distribution<int> distrib(1, 27);
for (int n = 0; n <= 7; ++n)
std::cout << distri