是跨平台的生成_CANONICAL输出一致

Is generate_canonical output consistent across platforms?

本文关键字:CANONICAL 输出 跨平台      更新时间:2023-10-16

c 标准在 [rand.util.caronical] 下非常紧密地指定了模板函数 std::generate_canonical的工作方式(尽管它仅显示伪代码,而不是C 代码)。

是规格作者的意图,在RealType上数学上工作的不同平台上,对于确定性的URNG,在两个平台上给出相同的输出,std::generate_canonical也给出了相同的输出吗?

这与类似的问题有关,例如1.0 std :: generate_caronical的有效输出? - 散文指出1.0被排除在外,但是它们在伪代码中给出的算法有时将其作为输出,而对于RealTypeURNG的某些组合。

这与所讨论的随机数分布函数相反,例如,由于C 11随机数分布在平台之间不一致 - 那里有哪些替代方案?该标准确实是"不"的,例如如何生成正态分布,只是其属性

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

链接的问题点在基本问题上遇到的困难与一致性:圆形模式。标准中generate_canonical的数学定义的明确意图是,urng被称为几次,每种都会产生一个非重叠的熵块,以填充结果;这将在平台之间完全一致。问题是,没有迹象表明如何处理LSB下方的额外位。根据舍入模式和求和顺序,这些可能会向上圆形,溢出到下一个块中(这允许1.0结果)。

现在,精确的措辞是"实例化的结果……尽可能按照以下指定的方式分布"。如果圆形模式是最新的,则产生1.0的实现不是尽可能统一(因为1-EPS的可能性低于1-2*EPS)。但这仍然是"如下所示"。因此,根据您如何解析该句子的方式,generate_canonical是完全指定且一致的,或者已将一些额外的未讨论位委托给了实施。

在任何情况下,某些实现产生1.0的事实表明,当前行为不是跨平台一致的。如果您愿意的话,似乎最直接的方法是将您的尿液包裹在independent_bits_engine中以产生一定因素的bits位,因此没有任何东西可以解决。