头文件
static const int A=48271;
static const int M=2147483647;
static const int Q=M/A;
static const int R=M%A;
//x[i+1]=Ax[i]modM
class Random
{
public:
explicit Random(int initialValue=1);//x[0]种子
int randomInt();
double random0_1();
int randomInt(int low,int high);
private:
int state;
};
#include <chrono>
#include <random>
#include <functional>
using namespace std;
static inline int currentTimeSeconds()
{
auto now=chrono::high_resolution_clock::now().time_since_epoch();
return (chrono::duration_cast<chrono::seconds>(now)).count();
}
class UniformRandom
{
public:
UniformRandom(int seed=currentTimeSeconds()):generator(seed){}
//生成伪随机int
int nextInt()
{
static uniform_int_distribution<unsigned int> distribution;
return distribution(generator);
}
//生成[0,high)之间的伪随机int
int nextInt(int high)
{
return nextInt(0,high-1);
}
//生成[low,high]之间的伪随机int
int nextInt(int low,int high)
{
uniform_int_distribution<int> distribution(low,high);
return distribution(generator);
}
//生成[0,1)之间的伪随机double
double nextDouble()
{
static uniform_real_distribution<double> distribution(0,1);
return distribution(generator);
}
private:
mt19937 generator;
};
cpp文件
#include "Random.hpp"
Random::Random(int initialValue)
{
if(initialValue<0)
initialValue+=M;
state=initialValue;
if(state==0)
state=1;
}
//由于直接乘法计算会溢出,因此转化成别的形式计算下一个数
int Random::randomInt()
{
int tmpState=A*(state%Q)-R*(state/Q);
if(tmpState>=0)
state=tmpState;
else
state=tmpState+M;
return state;
}
double Random::random0_1()
{
return static_cast<double>(randomInt())/M;
}
//生成[low,high)之间的随机整数
int Random::randomInt(int low, int high)
{
return static_cast<int>(random0_1()*(high-low))+low;
}
main.cpp
#include <iostream>
#include "Random.hpp"
#include "UniformRandom.hpp"
using namespace std;
int main()
{
Random rand(1);
cout<<rand.randomInt()<<endl;
cout<<rand.randomInt()<<endl;
cout<<rand.random0_1();
cout<<rand.randomInt(2,6)<<endl;
cout<<rand.randomInt(2,6)<<endl;
cout<<rand.randomInt(2,6)<<endl;
cout<<rand.randomInt(2,6)<<endl;
cout<<rand.randomInt(2,6)<<endl;
cout<<rand.randomInt(2,6)<<endl;
cout<<rand.randomInt(2,6)<<endl;
cout<<rand.randomInt(2,6)<<endl;
cout<<endl;
UniformRandom uniRand;
cout<<uniRand.nextInt()<<endl;
cout<<uniRand.nextInt(2)<<endl;
cout<<uniRand.nextInt(0, 1)<<endl;
cout<<uniRand.nextDouble()<<endl;
}
结果
48271
182605794
0.6013535
5
2
4
3
3
4
2
556515564
0
1
0.595942