【问题标题】:rand changes value without changing seedrand 改变价值而不改变种子
【发布时间】:2012-04-19 09:46:51
【问题描述】:

采取以下程序:

#include <cstdlib>
using std::rand;

#include <iostream>
using std::cout;

int main()
{
    cout << rand() << ' ' << rand() << ' ' << rand() << '\n';
}

由于rand 产生相同的值,只要不使用srand 更改种子,这应该产生三个相同的数字。
例如

567 567 567

但是,当我运行这个程序时,它给了我三个不同的值。
例如

6334 18467 41

当程序再次(编译和)运行时,会生成相同的三个数字。在我开始从rand 获得不同的结果之前,我不应该使用srand 来更改种子吗?这只是我的编译器/实现试图帮我一个忙吗?

操作系统:Windows XP
编译器:GCC 4.6.2
库:MinGW

编辑: 通过尝试使用srand,我发现这是种子 1 的结果(我猜这是默认值)。

【问题讨论】:

  • +1 简称,完整的示例程序。 +1 用于显示程序产生的内容。 +1 用于展示您期望它产生的效果。
  • 您是在建议在每次调用 rand 之前都需要为随机数生成器播种?这听起来更像是用户生成的数字,而不是随机生成的数字。
  • 如果rand 在一个函数中的所有出现都给出了相同的结果,那么它根本就没有用。
  • @chris:我认为你记错了你的学习。您可能被告知更像是“您需要在开始使用随机数生成器之前为其播种,否则您每次都会得到相同的 sequence 值”
  • 仅供参考:c-faq.com/lib/srand.html

标签: c++ random random-seed


【解决方案1】:

rand() 的每次调用都会生成一个不同的随机数。

种子实际上决定了创建的随机数序列。使用不同的种子会给你另外 3 个随机数,但对于给定的种子,你总是会得到这 3 个数字。

如果您想多次获得相同的号码,只需调用一次rand() 并将其保存在变量中。

【讨论】:

  • 对 rand() 的不同调用可以返回相同的值。
  • 确实如此。我在想每次调用而不是每次执行都不同。当然,确实某个种子在数学上最终可能会生成相同的三个数字。
  • 大卫,你说的完全正确,我只是觉得这太罕见了,不值得一提。我应该说它总是(伪)随机的,无论它实际上是否是相同的数字。
【解决方案2】:

多次调用rand() 有意在每次调用时产生一个不同的随机数。

除非您的程序在每次运行时调用 srand() 时使用不同的值,否则每次运行的顺序都是相同的。

您可以使用srand() 来使整个序列每次都不同。您还可以使用已知值调用 srand() 来重置序列 - 对测试很有用。

请参阅 rand()srand() 的文档。

【讨论】:

  • rand() 可以连续 3 次返回相同的数字。
  • 那是我的问题。不过,我必须感谢 ThomasG,因为他是第一个发布答案来解释我思考过程中的错误的人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 2021-09-11
  • 2014-11-09
  • 2019-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多