【发布时间】:2010-03-10 19:31:47
【问题描述】:
我正在学习编程课程,我们使用的是 C++。 我们有一个任务,在某些时候,我们需要编写一个函数,该函数将在 [upper, lower] 区间中返回一个随机数。我使用了以下内容:
lower + (int) (upper * (rand() / (RAND_MAX + 1.0)));
我没有忘记使用srand((unsigned int) time(0))更改srand。
但是,我每次都得到相同的值!我向我的教授寻求帮助,经过一番调查,他发现rand() 生成的第一个数字并不是那么随机......高阶位保持不变,并且由于此实现使用它们,最终结果是'和我预期的不太一样。
有没有比丢弃第一个值或使用余数来实现我想要的更优雅、更简单的解决方案?
非常感谢您的关注!
~弗朗西斯科
编辑:谢谢大家的意见。我不知道rand() 是一个如此糟糕的 RNG:P
【问题讨论】:
-
rand()不是已经过时了吗?我认为这些天每个人都应该使用random()。 -
lower + rand() % (upper - lower + 1)有什么问题?为什么不想使用余数? -
只是插话,我也注意到了这一点。如果您实际上只是在每次发现它不完全相同时打印出第一个 rand() ,但这些数字都相当接近。例如,现在当我连续多次启动一个程序时,我得到的数字都在 23000 范围内,例如作为第一个数字。之后数字更加随机。我总是像你提到的那样丢弃第一个 rand() 数字。
-
你确定是高位保持不变吗? “C 中的数字食谱”一书暗示它是相反的,即低阶位的随机性要小得多。 rand(3) 手册页 (linux.die.net/man/3/rand) 实际上引用了那本书。
-
Void:是的,我知道低阶位应该不那么随机。但是,在这种特殊情况下,我发现生成的第一个数字正好相反。