关于产生服从U(0,1)的随机数的过程

本文介绍了如何正确生成服从均匀分布(0,1)的随机数,使用boost库的mt19937随机数生成器和uniform_real分布。强调了在循环中错误地重复初始化随机数生成器会导致问题,因为正确的做法应是在循环外初始化并多次调用生成器。解析部分提到数学原理和伪随机数序列的特点。

1 正确方法

//产生服从(0,1)之间均匀分布的随机数

    boost::mt19937 rng;                 // produces randomness out of thin air
                                      // see pseudo-random number generators
    boost::uniform_real<> one(0,1);      // distribution that maps to 0..1
                                      // see random number distributions
    boost::variate_generator<boost::mt19937&, boost::uniform_real<> > die(rng, one);  // glues randomness with mapping
    
    // 确定个体性别与基因型
    for (int i=0;i<N;i++)
    {

        u1 = die();                      // simulate rolling a die
        cout<< u1 <<endl;

        if (u1<s/(1+s))
            S[i]=1;
        else
            S[i]=2;
    }

 


2 易错点:把产生随机数的这个过程放到for里面,i.e.

 

/产生服从(0,1)之间均匀分布的随机数

     
    // 确定个体性别与基因型
    for (int i=0;i<N;i++)
    {
     
 boost::mt19937 rng;                 // produces randomness out of thin air
                                      // see pseudo-random number generators
       boost::uniform_real<> one(0,1);      // distribution that maps to 0..1
                                      // see random number distributions
       boost::variate_generator<boost::mt19937&, boost::uniform_real<> > die(rng, one);  // glues randomness with mapping

        u1 = die();                      // simulate rolling a die
        cout<< u1 <<endl;

        if (u1<s/(1+s))
            S[i]=1;
        else
            S[i]=2;
    }

 

3 解析: 这个和数学有关,这种伪随机数算法是一次生成一串的,刚才错误的做法等于构造析构了N遍的随机数生成器。

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值