【问题标题】:Generate reproducible large number sequences - with pseudo random generator?生成可重现的大数序列 - 使用伪随机生成器?
【发布时间】:2016-10-23 01:14:09
【问题描述】:

我正在使用和重用我用rand()(重新)生成的大数序列。为了获得不同的序列,我使用 srand() 和不同但已知的种子。

这种方法的便携性如何?这是否适用于具有不同版本的 libc 以及编译器和 CPU 的不同平台?

有比这种方法更安全的替代方法吗?

澄清一下:这用于加密。

【问题讨论】:

  • 对于 c 和更早的 c++,这似乎是可行的方法,对于 c++11 及更高版本,请参阅stackoverflow.com/questions/25644465/…
  • "为了获得不同的序列,我使用带有知名种子的srand()。" - 嗯,你确实看到了矛盾,是吗?
  • @Olaf 感谢您指出这个奇怪的措辞,我改变了它 - 希望变得更好。
  • 你仍然没有完全理解。请阅读随机函数的文档以及如何使用srand

标签: c++ c random numbers


【解决方案1】:

参见 C++14 标准,26.8.5:C 库 [c.math]

[...] [注意:本标准中的随机数生成 (26.5) 工具通常比 rand 更可取,因为 rand 的底层算法未指定。因此继续使用 rand 不可移植,具有不可预测且经常受到质疑的质量和性能。 ——尾注]

所以标准明确指出使用 rand 是不可移植的。标头 立即为随机数生成器提供了一系列不同的模板,每个模板都指定了算法,因此是可移植的。然后由您来选择...除了 std::default_random_engine 之外的所有内容,这留给实现再次选择(26.5.5,[10]:

备注:此 typedef 命名的引擎类型的选择是实现定义的。 [...]

【讨论】:

    【解决方案2】:

    这种方法在多个方面存在缺陷。

    • 它使您的应用程序本质上是单线程的。

    • C 标准没有为 rand 指定算法,因此它可能因平台和编译器而异。

    • 任何外部(例如,GUI)代码都可能意外调用rand,从而使您的序列无效。在 C++ 中,情况变得更糟。 Read Compatibility section

    • 标准的rand 函数通常被认为不是很好。

    对于 C++,考虑使用 <random> 标头中的内容,尤其是 Mersenne Twister 的某些变体。

    对于 C,您可能应该寻找一些实现 MT 或其他好的 PRNG 的库。

    如果你想自己实现,Java Random 对大多数情况都足够好,而且易于实现。

    【讨论】:

      【解决方案3】:

      您可以保证在特定实现中为特定种子获得相同的数字序列。不能保证您在不同的实现中为特定种子获得相同的序列。

      如果您只关心序列是可重复的,那么您很好。如果您关心不同实现的顺序是否相同,那您就不会。

      【讨论】:

        猜你喜欢
        • 2011-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-18
        • 2012-02-09
        • 2015-08-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多