使用伪随机发生器生成可重现的大数序列
Generate reproducible large number sequences - with pseudo random generator?
我正在使用并重复使用我(re)使用rand()
生成的大数字序列。要获取不同的序列,我使用的是具有不同但已知种子的srand()
。
这种方法的便携性如何?这会在不同版本的LIBC和Compilers and CPU上使用不同的平台吗?
这种方法有更安全的替代方案吗?
只是为了澄清:这是不是用于加密用法。
保证您可以在特定实现的特定种子中获得相同的数字序列。您不能保证在不同实现的特定种子中获得相同的序列。
如果您只关心序列是可重复的,那就很好。如果您在乎整个实现的序列是相同的,那么您不是。
这种方法以多种方式存在缺陷。
-
它使您的应用程序固有地单线螺纹。
-
c标准未指定
rand
的算法,因此平台和编译器之间可能会有所不同。 -
任何外部(例如GUI)代码可以偶然呼叫
rand
,使您的序列无效。在C 中,情况变得更糟。阅读兼容性部分。 -
标准
rand
功能通常被认为不是很好。
对于C ,请考虑使用<random>
标头的内容,尤其是Mersenne Twister的某些变体。
对于C,您可能应该寻找某些实施MT或其他良好prng的库。
如果您想自己实施,Java随机在大多数情况下都足够好,并且易于实现。
参见C 14标准,26.8.5:C库[C.Math]
[...] [注意:此标准中的随机数(26.5)设施通常比RAND更可取,因为兰德的基础算法未指定。因此,兰德的使用继续 不可预测的质量和性能不可预测。 - 终注]
因此,标准指示可以清楚地指出,使用RAND不可移植。标题立即为随机数生成器提供一系列不同的模板,每种算法被指示并因此是可移植的。然后由您选择...除了std::default_random_engine
以外的所有内容,该实现都可以再次选择(26.5.5,[10]:
备注:该键入命名的发动机类型的选择是实现定义的。 [...]
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么 Serial.println(<char[]>);返回随机字符?
- 字符串-C++后显示的随机字符
- 循环中的随机函数
- 在c++构造函数中使用随机字符串生成器
- 使用std::mt19937从字符串中返回一个随机单词
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 如何在C++中高效地构造随机骰子
- 在类中使用随机生成器时出现性能问题
- 在将数字随机生成为数组期间从内存输出随机数的数组
- 将字符随机转换为大写的函数
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 如何生成一个随机的 n 位数,其中 n 是任意的
- 将随机生成的数字添加到数组 + 对这些数组求平均值
- 如何使用要传递给 mt19937 的可选随机种子参数设计函数
- 我将如何防止整数在随机发生器中多次生成
- 随机发生器的重复初始序列
- 使用伪随机发生器生成可重现的大数序列
- 我无法弄清楚这个随机发生器有什么问题
- 为什么这个随机发生器不工作