1

我正在编写代码以使用密度函数在相空间中初始化粒子位置。我想根据任意分布对它们的位置进行随机抽样,而我发现的最简单的方法是创建一个小类,其中包含根据我给它的概率数组进行抽样所需的一切。但是,我发现每次运行代码时都会得到相同的数字序列。

vose *sampler = new vose(density, init_grid_count);

for (unsigned int i=0; i<20; i++)
{
    unsigned int index = sampler->alias_method();
    cout << index << '\t';
}

这是我使用的函数的定义

unsigned int vose::alias_method()
{
    double x = uniform(mt);

    unsigned int i = floor(array_size*x)+1;
    double y = array_size*x+1-i;

    if (y<distribution[i])
        return i;

    else
        return alias[i];
}

我发现,如果我在类的构造函数中执行相同的循环,以便在我初始化vose对象时运行它,它会按预期运行。这意味着它每次都会生成不同的随机序列。那么为什么当我在构造函数中执行此操作时它可以正常工作,但是当我在成员函数中使用它时它每次都输出相同的序列?

问题不在于我的编译器不支持种子生成。我正在使用该<chrono>库,当我在构造函数中打印出种子时,每次都不同。如果您认为构造函数中可能有问题,这里就是。

vose::vose(double *array, unsigned int size)
{
    //Initialize
    auto seed = chrono::high_resolution_clock::now().time_since_epoch().count();
mt19937 mt(seed); // Seeds Mersenne Twister with Device RNG

    uniform_real_distribution<double> uniform(0, 1);

    distribution = array;
    array_size = size;

    alias = new unsigned int[size];
    for (unsigned int i = 0; i<size; i++)
    {
        alias[i] = i+1;
    }
}

编辑:要非常清楚,当我在构造函数中运行该方法时,一切正常。但是,这显然不是我最终要运行它的地方,所以我需要弄清楚如何在代码的主要部分运行一个方法。

编辑:为了响应我隐藏生成器或其他东西的可能性,这里是头文件中的类声明。

class vose
{
public:
    vose(double*, unsigned int);
    void demo();
    unsigned int alias_method();

private:
    std::mt19937 mt;

    // I struggled with this for a while, you don't give it args
    // until you use it since it's not a function, it's a strange class
    std::uniform_real_distribution<double> uniform;

    double *distribution;
    unsigned int array_size;
    unsigned int *alias;
};
4

0 回答 0