【问题标题】:Is there equalvalent in C++- For a given seed, the order of the random numbers will always be the sameC++ 中是否有等价物 - 对于给定的种子,随机数的顺序将始终相同
【发布时间】:2022-01-01 00:13:54
【问题描述】:

如果我在 Java 中有以下内容...我想让用户指定随机数生成器的种子,因此对于给定的种子,随机数的顺序始终相同...最终将输入种子每次生成相同的字母模式..

        Random rand = new Random(Long.parseLong(t[0])); 

       char r = (char)(rand.nextInt(26) + 'A');
        
What would be the equvalent to do the same for random in C++

cin >> seed;
srand(seed);
 char('A' + rand() % 26)

srand(seed) 是否可以在 C++ 中工作..我已经看到响应以是或否的方式进行...

【问题讨论】:

  • Java Random 在使用相同种子时总是返回相同的数字,只要所有 Java 版本都使用相同的 Random 实现算法。但是该算法可以随时或在任何 Java 发行版中被替换。不要依赖它的确定性!例如。几年前,Android 的 SecureRandom 实现已被替换,许多应用程序都遇到了问题。如果您想要确定性输出,请使用标准化的密钥生成函数,例如 PBKDF2。
  • 那么,究竟是什么阻止了您尝试基于 srand 的方法,看看它是否能按您的预期工作?

标签: java c++ random


【解决方案1】:

C++ 中是否存在等价-对于给定的种子,随机数的顺序总是相同的

是的。这种行为是所有伪随机数生成器所固有的。

C++ 标准库在 <random> 标头中有伪随机数 API。还有旧的 C PRNG API,但我建议不要将它用于任何需要高质量随机性的东西。


但是有一个警告。只要 PRNG 算法保持不变,序列就会相同。旧 C API 的算法没有准确指定,因此序列可以 - 并且确实 - 在不同的标准库和/或语言实现中有所不同。这个问题同样适用于 Java 虚拟机的不同实现。

<random> API 的生成器引擎是精确指定的,因此在实现之间是确定性的,除了 std::default_random_engine,它可以——而且确实——在不同的实现中有所不同。不幸的是,标准 API 的分布(均匀、正态等)并未准确指定,因此使用它们会在标准库实现之间引入潜在的差异。

【讨论】:

  • 一种解决方案是编写您自己的简单 PRNG 版本并使用它。甚至只是从一个版本中复制实现,这样您就可以确保它对于您自己的程序始终是相同的。
猜你喜欢
  • 2016-09-20
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 2018-03-26
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
  • 1970-01-01
相关资源
最近更新 更多