Rand()不涉及时间的种子
rand() seed that does not involve time?
使用srand(time(NULL))
似乎过于确定。例如,当我运行std::cout << rand() % 9000
时,我得到4275。当我再次运行时,我得到4311。这太依赖于时间了。
如果您使用c++,我建议您使用标准库中的<random>
。比rand()
可靠得多
你的方法的问题是,你只是取了两个样本,并假设它是整体人口的代表(即:统计谬误基于无关紧要的样本量)。rand()
函数返回的值有效地在[0, RAND_MAX]
上形成均匀分布。你提供的例子不是一个很好的例子。
srand(time(NULL))
通常是一种不错的方法。唯一存在重大安全风险的时候是在单核嵌入式芯片上运行,而该芯片没有备用电池用于系统时钟。我曾经用摩托罗拉的一些董事会做过这样的工作,大约90%的情况下,当我们的程序加载时,我们最终得到的是相同的随机种子值。我相信80年代的一些宾果机很容易受到这种影响,因为它们被设计成全天候运行,但操作员每天晚上都把它们关掉。
最后,rand()
最多是半体面的。如果你想要一个具有更好属性的随机数生成器(即:"接近"种子值不提供类似的模式,输出值范围更广,偏差最小),请考虑使用外部RNG算法。
引用
- 初始化土地的推荐方法?, 2014-06-02,
<https://stackoverflow.com/questions/322938/recommended-way-to-initialize-srand>
- rand()和random()函数有什么区别?, 2014-06-02发布,
<https://stackoverflow.com/questions/18726102/what-difference-between-rand-and-random-functions>
- C库的rand()和rand()有哪些替代方案?, 2014-06-02,
<http://benpfaff.org/writings/clc/random.html>
如果出于某种原因,您卡住了使用rand()
,请尝试在调用srand
后从中抽出几个值。在第一次调用rand
时,相关性最大,此后逐渐降低。
srand(time(NULL));
rand();
rand();
您也可以使用/dev/random
或/dev/urandom
中的值(或Windows中的等效值)作为种子
相关文章:
- C++为构建时间获取QDateTime的可靠方法
- 从持续时间构造std::chrono::system_clock::time_point
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- while循环中while循环的时间复杂度是多少
- 使用简单类型列表实现的指数编译时间.为什么
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 在已经使用Git的情况下减少编译时间
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 从文本文件中读取时钟时间和事件时间并进行处理
- 具有未知值时的时间复杂性
- 如何减少花费的时间
- C++在变量给定的指定时间内关闭电脑
- rcpp函数中的清理时间很长
- 如何在不使用时间作为种子的情况下在C++中生成随机数
- 生成一个随机种子给srand()-不是时间(NULL)
- c++随机数字总是相同的,即使时间(0)作为种子
- 为什么在对随机数生成器进行时间种子设定时会收到可能丢失数据的警告(NULL)
- Rand()不涉及时间的种子
- 如何用时间()和一个键(字符串)为srand种子