C标准在[rand.util.canonical]下非常详细地指出模板函数std :: generate_canonical如何工作(尽管它只呈现伪代码,而不是C代码).
规范作者的意图是,在RealType上的数学运算相同的不同平台上,对于在两个平台上提供相同输出的确定性URNG,std :: generate_canonical也提供相同的输出吗?
这与类似的问题有关,例如Is 1.0 a valid output from std::generate_canonical? – 散文声明1.0被排除在外,但它们在伪代码中给出的算法有时包括它作为输出以及RealType和URNG的某些组合.
这与随机数分布函数形成对比,例如,作为C++11 random number distributions are not consistent across platforms — what alternatives are there?;标准确实”’不”’指定如何生成正态分布,仅指定其属性
我没有找到任何讨论这个问题的DR,标准的措辞在我容易访问的C 11,C 14和C 17草案标准中表面上是相同的.
最佳答案 链接问题中遇到的困难指出了一致性的基本问题:舍入模式.标准中generate_canonical的数学定义的明确意图是URNG被多次调用,每个都产生一个非重叠的熵块来填充结果;这将在各个平台上完全一致.问题是,没有说明如何处理LSB下面的额外位.根据舍入模式和求和顺序,这些可以向上舍入,溢出到下一个块(这是允许1.0结果).
现在,准确的措辞是“实例化的结果……尽可能均匀地分布,如下所述”.如果舍入模式是舍入到最接近的,则产生1.0的实现不尽可能均匀(因为1-eps不太可能比1-2 * eps).但它仍然“如下所述”.因此,根据您解析该句子的方式,generate_canonical要么是完全指定的,要么是一致的,或者已经为实现委派了一些额外的未讨论的位.
在任何情况下,某些实现产生1.0的事实使得很明显当前行为不是跨平台一致的.如果你想要这样,似乎最直接的方法是将你的URNG包装在一个independent_bits_engine中以产生一些比特位因子,所以从来没有任何东西可以舍入.