對於可以解析表達成C++的特殊概率分布,根據概率論的原理,產生均勻分布的隨機分布,而後代入分布函數就可以產生高斯分布的隨機數了阿.下面原版轉載:
At the core of any pseudorandom number generation software is a routine for generating uniformly distributed random integers.
In C++ TR1 you have your choice of several core generators that it calls “engines.” The following four engine classes are supported in the Visual Studio 2008 feature pack
(微軟已經發布了Visual Studio 2008的Services Pack 1,它包含了此前發布的feature pack,以及完整的TR1支持,後來又發布了壹個修正:VC 2008 SP1: Problems with STL/TR1 after installing VS2008 SP1,關於:VC9 SP1 Hotfix For The vector<function<FT>> Crash,關於文檔:微軟TR1文檔).
linear_congruential uses a recurrence of the form x(i) = (A * x(i-1) + C) mod M
mersenne_twister implements the famous Mersenne Twister algorithm
subtract_with_carry uses a recurrence of the form x(i) = (x(i - R) - x(i - S) - cy(i - 1)) mod M in integer arithmetic
subract_with_carry_01 uses a recurrence of the form x(i) = (x(i - R) - x(i - S) - cy(i - 1)) mod 1 in floating point arithmetic
Each engine has a seed() method that accepts an unsigned long argument to specify the random number generation seed. It is also possible to set the seed in more detail using template parameters unique to each engine.
微軟的C++ TR1可以生成以下分布的隨機數:
Generates a Bernoulli distribution.
Generates a binomial distribution.
Generates an exponential distribution.
Generates a gamma distribution.
Generates a geometric distribution.
Generates a normal distribution.
Generates a Poisson distribution.
Generates a uniform integer distribution.
Generates a uniform floating-point distribution.
試驗壹:在VS2008中先建壹空的VC++項目文件,然後添加新建項cpp文件如下:
#include <random>
#include <iostream>
void main(){
std::tr1::mt19937 eng; // a core engine class:Mersenne Twister generator
std::tr1::normal_distribution<double> dist;
std::tr1::uniform_int<int> unif(1, 52);
for (int i = 0; i < 10; ++i) //產生正態分布的10個隨機數
std::cout << dist(eng)<<std::endl;
for(int i = 0; i < 5; ++i) //產生均勻分布的在1到52之間的五個整數隨機數
std::cout << unif(eng) << std::endl;
}
在循環中,每循環壹次,就調用mt19937 eng壹次,產生壹個隨機數輸出。
試驗二:關於種子seed
#include <random>
#include <iostream>
#include <time.h>
void main(){
std::tr1::mt19937 eng; // a core engine class:Mersenne Twister generator
std::tr1::normal_distribution<double> dist;
std::tr1::uniform_int<int> unif(1, 52);
eng.seed((unsigned int)time(NULL)); // reseed base engine 設置種子用#include <time.h>, 不能用#include <time>
for (int i = 0; i < 10; ++i) //產生正態分布的10個隨機數
std::cout << dist(eng)<<std::endl;
//eng.seed(); // reseed base engine
for(int i = 0; i < 5; ++i) //產生均勻分布的在1到52之間的五個整數隨機數
std::cout << unif(eng) << std::endl;
}
試驗三:隨機數寫入文件
#include <random>
#include <iostream>
#include <fstream>
#include <time.h>
using namespace std;
using namespace std::tr1;
void main()
{
mt19937 eng; // a core engine class:Mersenne Twister generator
normal_distribution<double> dist;
uniform_int<int> unif(1, 52);
eng.seed((unsigned int)time(NULL)); // 設置種子用#include <time.h>, 不能用#include <time>
for (int i = 0; i < 10; ++i) //產生正態分布的10個隨機數
cout << dist(eng)<<endl;
ofstream fileout("fileout.dat");
for(int i = 0; i < 5; ++i) //產生均勻分布的在1到52之間的五個整數隨機數
fileout << unif(eng)<< endl;
fileout.close();
}
試驗四:第三方"Mersenne Twister"隨機數生成程序使用試驗(程序來源:Agner Fog http://www.agner.org/random/)
// 使用說明:從網站下載壓縮包,http://www.agner.org/random/randomc.zip
// 展開後,將其中的randomc.h頭文件及mersenne.cpp文件Copy到項目文件夾,
// 並將它們加入到項目中,其中包括"Mersenne Twister"的實現
#include <iostream>
#include <time.h>
#include "randomc.h" // define classes for random number generators
using namespace std;
void main()
{
int seed = (int)time(0); // random seed
// choose one of the random number generators:
CRandomMersenne RanGen(seed); // make instance of random number generator
cout<<"\n\nRandom integers in interval from 0 to 99:\n";
for (int i = 0; i < 40; i++) {
int ir = RanGen.IRandom(0,99);
cout<<ir<<" ";
}
cout <<endl;
cout<<"\n\n\n\nRandom floating point numbers in interval from 0 to 1:\n";
for (int i = 0; i < 40; i++) {
float fr = RanGen.Random();
cout<<fr<<" ";
}
cout <<endl;
}
試驗五:第三方"Mother-Of-All"隨機數生成程序使用試驗(程序來源:Agner Fog http://www.agner.org/random/)
// 使用說明:從網站下載壓縮包,http://www.agner.org/random/randomc.zip
// 展開後,將其中的randomc.h頭文件及mother.cpp文件Copy到項目文件夾,
// 並將它們加入到項目中,其中包括"Mother-Of-All" generator invented by George Marsaglia 的實現
#include <iostream>
#include <time.h>
#include "randomc.h" // define classes for random number generators
using namespace std;
void main()
{
int seed = (int)time(0); // random seed
// choose one of the random number generators:
CRandomMother RanGen(seed); // make instance of random number generator
cout<<"\n\nRandom integers in interval from 0 to 99:\n";
for (int i = 0; i < 40; i++) {
int ir = RanGen.IRandom(0,99);
cout<<ir<<" ";
}
cout <<endl;
cout<<"\n\n\n\nRandom floating point numbers in interval from 0 to 1:\n";
for (int i = 0; i < 40; i++) {
float fr = RanGen.Random();
cout<<fr<<" ";
}
cout <<endl;
}
試驗六:第三方"SFMT"隨機數生成程序使用試驗(程序來源:Agner Fog http://www.agner.org/random/)
重要提示:在編譯前,可以修改頭文件sfmt.h中的#define MEXP以及下面相應的宏代碼:Choose one of the possible Mersenne exponents. Higher values give longer cycle length and use more memory。SFMT利用了SSE2指令,速度最快,但只適合intel系列的部分芯片。
// 使用說明:從網站下載壓縮包,http://www.agner.org/random/randomc.zip
// 展開後,將其中的頭文件及sfmt.cpp文件Copy到項目文件夾,
// 並將它們加入到項目中,其中包括"SFMT" 的實現
#include <iostream>
#include <time.h>
#include "sfmt.h" // define classes for random number generators
using namespace std;
void main()
{
int seed = (int)time(0); // random seed
// choose one of the random number generators:
CRandomSFMT1 RanGen(seed); //註意可以是CRandomSFMT,是CRandomSFMT0,或CRandomSFMT1
cout<<"\n\nRandom integers in interval from 0 to 99:\n";
for (int i = 0; i < 40; i++) {
int ir = RanGen.IRandomX(0,99);
cout<<ir<<" ";
}
cout <<endl;
cout<<"\n\n\n\nRandom floating point numbers in interval from 0 to 1:\n";
for (int i = 0; i < 40; i++) {
float fr = RanGen.Random();
cout<<fr<<" ";
}
cout <<endl;
}