【问题标题】:Generating random numbers in C with different seed in every loop? [duplicate]在每个循环中用不同的种子在 C 中生成随机数? [复制]
【发布时间】:2017-09-28 00:54:00
【问题描述】:

注意:这篇文章不是如何在 C 中生成随机数的重复,它没有回答我的问题。

我有一个函数是:

double generator(double * ran_i) {
  srand(time(NULL));
  return ran_i[rand()%1000];
}

它需要一个包含 1000 个数字的数组,然后我尝试调用:

for(i=0; i< 1000; ++i) {
  printf("%lf", generator(ran[0]));
}

但是在那个循环中它总是给我相同的数字。我发现 time(NULL) 没有足够快地改变种子。如何在每个循环中更快甚至更好地更改此种子?此外,我只能使用与 ANSI C 标准兼容的库。

【问题讨论】:

  • 您应该只为 rng 播种一次,而不是使用不同的种子。 rng 的工作是为您提供一个随机数序列,种子只是确定该序列中的起点
  • 你不会改变你的种子,期间。你认为你为什么要这样做?
  • 建议的副本包含您的问题的答案,但不是您的问题。播种一次 PRNG。使用相同的值重新播种会为您提供相同的序列。如果你坚持重新播种,那是为了什么?
  • 我不确定你对标记副本的狡辩是什么;它询问的几乎正是您询问的代码。最合适的答案对两者都是一样的。

标签: c random time random-seed


【解决方案1】:

我发现 time(NULL) 没有足够快地改变种子。

那是准确的。 time 以秒为单位返回当前时间戳,因此每秒更改一次。

我怎样才能更快地改变这个种子......

你需要一个随机源。在 POSIX 上,您可能会使用 /dev/urandom,但这当然不一定适用于所有支持 ANSI C 的平台。

因此,结论是 ANSI C 中没有 API 可以访问纯随机种子源,因此在 ANSI C 中获得比每秒一次更快的新随机种子是不可行的。

...更好地在每个循环中更改它?

在每次调用时植入一个伪随机数生成器是愚蠢的 - 不要尝试这样做。只需在程序开始时播种一次。(如果需要重复序列,可以重新播种)。

【讨论】:

  • 我觉得“此外,每次通话都播种很愚蠢 - 不要尝试这样做。”应该在每个答案中更加突出。无论你做什么都可能解决所提出的问题,而事实上这个问题甚至不应该被提出,因为它正朝着一个完全错误的方向发展。
  • 你写的没有错,但可能会被误解。在每次通话中播种 prng 不仅愚蠢,而且绝对不是应该使用的方式。您可以提及问题的正确解决方案是什么
  • @tobi303 正确的解决方案是最后一句话:不要尝试在每次调用时都植入伪随机数生成器。但是,我要补充一点,他们应该播种一次:)
  • 粗体不足以强调;关于播种的说明确实应该是这个答案所说的第一件事。其他一切都只是为了帮助那些致力于做错事的人。
  • @Hurkyl 不,它应该是最后一句话,这样读者才能记住。这个问题——即使在他们的案例中被误导了——仍然有道理。如果您的程序可能在一秒钟内运行多次并且必须具有随机行为,那么访问变化速度快于每秒一次的随机种子至关重要。不幸的是,没有针对该问题的 ANSI C 解决方案(据我所知)。我的回答不仅适用于 OP,也适用于出于正确原因寻找相同问题的人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-23
  • 1970-01-01
  • 2018-06-29
  • 1970-01-01
  • 1970-01-01
  • 2017-08-29
  • 1970-01-01
相关资源
最近更新 更多