创建一个uniform_int_distribution<int>对象是否昂贵?

3

我正在编写代码,其中随机数从均匀分布中进行抽样,其边界在for循环的某些迭代中发生变化,例如:

std::mt19937 generator{0};
for(int i = 0; i < n; ++i)
{
  if(conditions are met)
  {
    // low and hi bounds change for each iteration
    std::uniform_int_distribution<int> U(low, hi);
    auto sample = U(generator);
  }

}


这是我目前编写代码的方式,但它会在每次满足条件的迭代中创建和删除一个临时的std::uniform_int_distribution<int>对象。这是一个昂贵的过程吗?编译器优化能否在for循环外部构建对象,并在if语句内重构均匀分布的边界?我不确定那是否更快。
还有其他可能更好的方法吗?

不应该是这样的。相关/重复:https://dev59.com/fO3zs4cB2Jgan1znxpGx - NathanOliver
这并没有回答问题,但是“creating and deleting”应该改为“creating and destroying”或者“newing and deleting”。在这种情况下,第一个选项更合适。 - Pete Becker
1个回答

4

std::uniform_int_distribution通常创建成本不高,其成员仅包含最小/最大值对。这在stdlibc++libc++VC++中都是如此。一个良好的优化编译器应该能够完全消除它的任何痕迹。

然而,并不能保证这一点,此外,分布允许具有状态。虽然这更多地适用于normal_distribution,而不是uniform_int_distribution


从技术上讲,可以在循环中重复使用分布并重新初始化其参数:

std::mt19937 generator{ 0 };
std::uniform_int_distribution<int> U;
for (int i = 0; i < n; ++i)
{
    // low and hi bounds change for each iteration
    U.param(std::uniform_int_distribution<int>::param_type(low, hi));
    auto sample = U(generator);
}

生成的代码可能是相同的(或稍微差一些 - 请确认),它并没有解决使用normal_distribution时更改参数会重置状态的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接