随机化算法中使用的随机数都是一定程度上随机的,称为伪随机数。线性同余法是产生伪随机数的最常用的方法,由线性同余法产生的随机序列a1,a2,a3.......an满足:
(1) a0 = d;
(2) an = (b*a(n-1)+c)%d
上式中,d称为随机数的种子,选取的着几个参数将直接影响到随机序列的随机性能,一般m应该取得充分大,因此可取机器大数,另外应取gcd(m,b)=1因此b可取一素数。随机数的种子是一个无符号整型,可由用户提供或者由机器自己产生。
函数RandomNumber在计算时,利用线性同于算法产生新的随机数种子,它的高16位随机性能比较好,将RandomNumber右移16位得到一个0到65536之间的随机整数,然后再将这个数映射到区间[0,n-1]
对于函数fRandom,产生一个[0,maxshort]区间上的随机整数,然后除以maxshort就得到[0,1)之间的随机实数。
代码如下:
(1)头文件RandomNumber.h
#include<iostream>
#include<ctime>
using namespace std;
const unsigned long maxshort = 65536L;
const unsigned long multiplier = 1194211693;
const unsigned long adder = 12345L;
class RandomNumber
{
private:
unsigned long randSeed;
public:
RandomNumber(unsigned long s=0);
//构造函数,默认由系统时间提供种子
unsigned short Random(unsigned long n);
//产生0到n-1之间的随机数
double fRandom(void);
//产生0到1之间的随机数
};
RandomNumber.cpp
#ifndef CREATOR_CSU_ENO
#define CREATOR_CSU_ENO
#include"RandomNumber.h"
RandomNumber::RandomNumber(unsigned long s)
{
if(s==0)
randSeed=time(NULL);
else
randSeed= s;
}
unsigned short RandomNumber::Random(unsigned long n)
{
randSeed = multiplier*randSeed+ adder;
return (unsigned short)((randSeed>>16)%n);
//产生0到n-1之间的随机数
}
double RandomNumber::fRandom(void)
{
return Random(maxshort)/(double)maxshort;
//产生0到1之间的随机数
}
#endif //CREATOR_CSU_ENO
测试文件:利用随机数计算圆周率
[cpp] view plaincopyprint?
#include"RandomNumber.h"
double Darts(int n)
{
static RandomNumber dart;
int count=0;
double x;
double y;
for(int i=1;i<=n;i++)
{
x=dart.fRandom();
y= dart.fRandom();
if(x*x+y*y<=1)
count++;
}
return 4*count/double(n);
}
int main()
{
int number;
cout<<"Please Enter the number";
cin>>number;
cout<<Darts(number)<<endl;
return 0;
}