【问题标题】:When generating random numbers, will the same sequence being generated if the distribution function object gets created multiple times?生成随机数时,如果多次创建分布函数对象,会生成相同的序列吗?
【发布时间】:2022-01-26 22:33:27
【问题描述】:

我知道伪随机数生成器应该只用一个种子初始化一次。但是,在 C++ 中,随机数生成器和分布是分开的。

现在,分布函数对象应该创建一次吗?还是没关系?我的意思是,在从分布生成随机数时,将分布对象创建调用放在内部还是外部是否重要。或者这并不重要,因为分布函数只是将生成器映射到一个数字。

我问的原因是因为我使用生成器来生成从几个不同分布中提取的数字,最好将分布函数对象创建调用放在每个函数中并共享相同的随机数生成器。

int main()
{
    boost::mt19937 rng(2);

    //inside the function
    rn_int_1(rng);
    rn_int_1(rng);

    boost::mt19937 rng2(2);
    //outside the function
    boost::random::uniform_int_distribution<> six(1,6);
    rn_int_2(six,rng2);
    rn_int_2(six,rng2);
    exit(0);
}


void rn_int_1(boost::mt19937 & generator)
{
    
    boost::random::uniform_int_distribution<> six(1,6);
    cout<<six(generator)<<endl;
    cout<<six(generator)<<endl;
    cout<<six(generator)<<endl;
}
void rn_int_2(boost::random::uniform_int_distribution<> &six,boost::mt19937 & generator)
{
    cout<<six(generator)<<endl;
    cout<<six(generator)<<endl;
    cout<<six(generator)<<endl;
}

结果是:

3
2
1
6
4
6
3
2
1
6
4
6

【问题讨论】:

  • "分布函数是否应该被调用一次":你的问题实际上是是否应该创建一个分布函数对象boost::random::uniform_int_distribution&lt;&gt; six(1,6); 是变量定义,不是函数调用。对分布函数(对象)的调用发生在six(generator)
  • @user17732522 谢谢!修改了我的问题。
  • 顺便说一句,我刚刚注意到了。您使用 boost 而不是标准库是否有原因?不能用 C++11 或更高版本吗?
  • @user17732522 不完全是……这个问题是关于开销的……我更关心如果种子是固定的,它是否会生成相同的序列……

标签: c++ random boost


【解决方案1】:

分发不会创建随机位序列。这来自随机位引擎。分布修改位序列以便以某种方式分布它们。简单地说,随机性来自引擎,而不是分布。

话虽如此,一直重新创建分发对象是不好的形式。发行版不是无状态的,它们通常可以保留一些先前调用中未使用的位,否则如果您将它们丢弃,它们就会丢失。

【讨论】:

  • 谢谢!所以就生成的序列而言,它们应该是相同的。但是不断生成新对象是一种不好的做法吗?但是分布对象是在函数中生成的,所以应该没关系吧?
  • @weeo:“所以就生成的序列而言,它们应该是相同的。”不,它们不应该。它们将符合相同的分布(介于 1 和 6 之间)。但是因为引擎保持不变,你会从不同的调用中得到不同的位,这将导致不同的 values 序列。
  • 我的意思是两者都从同一个种子开始。一个创建分布对象多次,一个不是,但生成器的调用次数完全相同...
  • @weeo:不,可能不会产生相同的值序列。正如我在回答中添加的那样,分布不是无状态的。这是为什么你不应该无意义地扔掉它们的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多