generate_canonical输出是否跨平台一致?

时间:2017-03-08 17:10:21

标签: c++ random floating-point cross-platform

C ++标准非常接近 [rand.util.canonical] 指定模板函数std::generate_canonical如何工作(尽管它只呈现伪代码,而不是C ++代码)。

规范作者的意图是,在RealType上的数学运算相同的不同平台上,以及在两个平台上提供相同输出的确定性URNG,{{1还提供相同的输出?

这与类似Is 1.0 a valid output from std::generate_canonical?之类的问题有关 - 散文表明1.0被排除在外,但是他们在伪代码中提供的算法有时会将其作为输出包含在std::generate_canonicalRealType的某些组合中。 URNG

这与随机数分布函数形成对比,例如,C++11 random number distributions are not consistent across platforms -- what alternatives are there?;标准不会'''''''''指定如何生成正态分布,仅指定其属性

我还没有找到任何讨论这个问题的DR,标准的措辞在C ++ 11,C ++ 14和C ++ 17草案标准中表面上是相同的,我可以轻松访问。

1 个答案:

答案 0 :(得分:1)

链接问题中遇到的困难指出了一致性的基本问题:舍入模式。标准中generate_canonical的数学定义的明确意图是URNG被多次调用,每个都产生一个非重叠的熵块来填充结果;这将在各个平台上完全一致。问题是,没有说明如何处理LSB下面的额外位。根据舍入模式和求和顺序,这些可以向上舍入,溢出到下一个块(这允许1.0结果)。

现在,准确的措辞是"实例化的结果......尽可能均匀地分布,如下所示"。如果舍入模式是舍入到最接近的,则产生1.0的实现尽可能均匀(因为1-eps不太可能比1-2 * eps)。但它仍然如下所述"。因此,根据您解析该句子的方式,generate_canonical要么是完全指定的,要么是一致的,或者已经为实现委派了一些额外的未讨论的位。

在任何情况下,某些实现产生1.0的事实使得很明显当前行为不是跨平台一致的。如果你想要这样,似乎最直接的方法是将你的URNG包装在independent_bits_engine中以产生bits位的某些因子,所以从来没有任何东西要循环。