【问题标题】:Why is std::uniform_int_distribution<IntType>::operator() not const?为什么 std::uniform_int_distribution<IntType>::operator() 不是 const?
【发布时间】:2020-01-31 04:46:40
【问题描述】:

据我了解,当用于拉取随机数时,分布不应改变。例如,对于均匀分布,它的最小值/最大值在我们使用它生成随机数时不应该改变,那么为什么operator() 不是 const 呢?

【问题讨论】:

  • 有些发行版一次计算多个随机数并缓存它们,以加快处理速度。他们可以使用mutable
  • @MarcGlisse 哪些发行版可以做到这一点,它是如何工作的?它不知道接下来会调用哪个生成器。即使可以 - 从精心播种的生成器中选择多个数字也是不友好的:-)
  • 在 libstdc++ 中,正态分布一次计算 2 个随机数。下次调用它时,它不会使用传递给它的生成器。
  • @TedLyngmo FWIW,与需要在 N 次调用后给出特定值的标准 PRNG 不同,所有标准分布仅由概率函数定义。只要它们满足这一点,就没有任何其他要求(除了必须存在的函数和 typedef)。如果您需要可移植性,则需要自行开发或从库中获取并专门使用它。
  • 谢谢 - 我查看了 gcc 9 的 uniform_int_distribution 标头,找不到任何关于它在那里保持状态的信息,并且重置实现为 void reset() { }。我发现它不止一次调用 PRNG 的唯一一次是它是否必须进行放大或缩小 - 但我对那里的所有下划线感到头疼,所以我可能错过了一些东西。

标签: c++ random constants c++-standard-library


【解决方案1】:

虽然min()max() 不会改变,但分布可能包含有助于它生成下一个值的状态。如果operator()const,那么在不保证对象是线程安全的情况下不能修改此状态。提供这种保证可能会很昂贵,并且分发意味着轻量级。

【讨论】:

  • "const => thread-safe":如果他们愿意,他们可以在标准中记录这个特定函数不必是线程安全的。 const 和线程安全的一般措辞只是在没有指定特定行为时的默认值。尽管如此,保持一致并省略const确实很方便。
  • @MarcGlisse 他们可以,但这会违反 C++ 尝试使用的最不令人惊讶的口头禅,尽管结果好坏参半。
猜你喜欢
  • 1970-01-01
  • 2015-10-06
  • 1970-01-01
  • 1970-01-01
  • 2018-07-30
  • 1970-01-01
  • 2016-03-15
  • 2015-10-19
相关资源
最近更新 更多