1

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

这是我的代码片段

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!

谢谢!

4

4 回答 4

7

使用随机标头中提供的一种分布可能更有意义。正如 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 ;
}
于 2013-12-11T18:42:10.593 回答
3

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

于 2013-12-11T18:29:10.487 回答
1

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

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

于 2013-12-11T18:29:59.097 回答
1

在 C++ 中,/整数会产生整数。例如 11 / 2 结果为 5,而不是 5.5。以同样的方式a / b,如果 总是为零a < b

你的问题在这里:

generator()/generator.max()

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

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

(double)generator()/generator.max()
于 2013-12-11T18:30:06.140 回答