生成规范化输出在不同平台上是否一致?

4
C++标准在[rand.util.canonical]中明确规定了模板函数std::generate_canonical的工作方式(尽管它只呈现伪代码,而不是C++代码)。
规范的作者意图是,在RealType上数学运算完全相同的不同平台上,对于一个产生相同输出的确定性URNGstd::generate_canonical也会给出相同的输出吗?
这与类似问题相关,比如std::generate_canonical是否会输出1.0? - 文字说明排除了1.0,但伪代码算法有时会将其包含在输出中,并且适用于某些RealTypeURNG组合。
相反,这与随机数分布函数不同,例如C ++ 11随机数分布在不同平台上不一致 - 有哪些替代方案?;标准没有指定例如正态分布是如何生成的,只有它的属性。
我没有找到任何讨论此事的DR,而我可以轻松访问的C++11、C++14和C++17草案标准的措辞在表面上是相同的。
1个回答

1
在链接问题中遇到的困难指向了一致性的基本问题:舍入模式。标准中generate_canonical的数学定义明确表明应该多次调用URNG,每次产生一个不重叠的熵块来填充结果;这将在各个平台上完全一致。问题是,没有说明如何处理LSB下面的额外位。根据舍入模式和求和顺序,这些位可能会向上舍入,溢出到下一个块(这就允许1.0的结果)。
现在,精确措辞是“实例化的结果...按照下面的规定尽可能均匀地分布”。如果舍入模式是四舍五入,则产生1.0的实现不是尽可能均匀的(因为1-eps比1-2*eps更不可能)。但它仍然“按照下面的规定”。因此,取决于您如何解析该句话,generate_canonical要么是完全指定和一致的,要么是将一些额外未讨论的位委托给实现。
无论如何,某些实现产生1.0这一事实表明当前行为不是跨平台一致的。如果你想要达到这个目的,最直接的方法似乎是将你的URNG包装在一个independent_bits_engine中,以产生bits位的某个因子,这样就永远不需要进行四舍五入。

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