【问题标题】:Issues with c++ 11 mersenne_twister_engine classc++ 11 mersenne_twister_engine 类的问题
【发布时间】:2013-12-11 18:23:38
【问题描述】:

我一直在尝试使用 c++ 11 mersenne_twister_engine 类(http://www.cplusplus.com/reference/random/mersenne_twister_engine/) 来生成区间 [0,1] 中的数字,但是我在每个数字上不断得到 0。

这是我的代码 sn-p

unsigned seed1 = std::chrono::system_clock::now().time_since_epoch().count();   

std::mt19937 generator(seed1); 
for (int i=0; i < WIDTH * HEIGHT; i++) //GENERATES THE MATRIX OF CONNECTIVITY
{

    double random = generator()/generator.max();
    if ( random  > VERT_CONNECTIVITY )
    vert_con[i] = 0;
    else vert_con[i] = 1;


}

generator() 和 generator.max() 似乎正在工作......它只是随机的,它给了我 0!

谢谢!

【问题讨论】:

  • 整数除以整数就是整数。
  • 为什么不使用uniform_int_distribution
  • if int a 0) (a%b=>a)
  • bernoulli_distribution 可能是更好的选择,考虑到二进制结果
  • 另外请记住,您可以使用 std::random_device 代替时间种子。

标签: c++ c++11 random mersenne-twister


【解决方案1】:

使用random header 中提供的发行版之一 可能更有意义。正如 Cubbi 指出的那样,std::bernoulli_distribution 看起来很适合您的问题。它会根据你传入的分布参数生成truefalse

#include <iostream>
#include <random>
#include <vector>
#include <algorithm>

const int WIDTH = 5 ;
const int HEIGHT = 5 ;
const double VERT_CONNECTIVITY = 0.25 ;

int main()
{
    std::random_device rd;
    std::mt19937 gen(rd());

    // give "true" 1/4 of the time
    // give "false" 3/4 of the time
    std::bernoulli_distribution d(VERT_CONNECTIVITY);

    std::vector<int> vert_con( WIDTH * HEIGHT ) ;

    std::generate( std::begin(vert_con), std::end( vert_con ), [&] () { return d(gen) ; } ) ;

    for (int i=0; i < WIDTH * HEIGHT; i++) 
    {
        std::cout << vert_con[i] << " " ;
    }
    std::cout << std::endl ;

    return 0 ;
}

【讨论】:

  • OP 可能正在寻找std::generate(std::begin(vert_con), std::end(vert_con), [&amp;]{ return d(gen); });
【解决方案2】:

也许您正在寻找generate_canonical&lt;double, bits&gt;(gen)?这将生成一个十进制值,均匀分布在区间[0,1) 中,具有bits 位随机性(53 是双精度可用的标准最大值)。

【讨论】:

    【解决方案3】:

    在 C++ 中,/ 在整数上产生整数。例如 11 / 2 结果为 5,而不是 5.5。同样,如果a &lt; ba / b 始终为零。

    你的问题在这里:

    generator()/generator.max()
    

    generator()generator.max() 都返回整数,当然还有generator.max() &gt;= generator(),所以结果为零(除非你很幸运得到了max 数字,在这种情况下结果将为一)。

    要解决这个问题,您可以简单地转换它:

    (double)generator()/generator.max()
    

    【讨论】:

      【解决方案4】:

      mersenne_twister_engine 返回UIntType 类型的结果。如果您希望结果为双精度,则需要将其强制转换为双精度。

      双随机数 = (double)generator()/generator.max();

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-05
        • 2012-10-13
        • 1970-01-01
        • 1970-01-01
        • 2012-03-16
        相关资源
        最近更新 更多