现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

C++如何产生随机数

2013-07-13 19:36 工业·编程 ⁄ 共 1746字 ⁄ 字号 暂无评论

    随机化算法中使用的随机数都是一定程度上随机的,称为伪随机数。线性同余法是产生伪随机数的最常用的方法,由线性同余法产生的随机序列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; 

给我留言

留言无头像?