【问题标题】:C program for generating random numbers [duplicate]用于生成随机数的 C 程序
【发布时间】:2015-04-20 05:01:08
【问题描述】:

我正在编写一个代码,它将返回一个介于 5 到 20 之间的随机数,我遇到了一个问题,它总是会再次产生相同的数字,而我似乎无法解决它。

#include <stdlib.h>
#include <stdio.h>

int random = 0;

int randomnumbergen() {
srand(12345);
random = rand() % (20 - 15) + 15;
return random;
}

【问题讨论】:

  • 这并不是一个奇迹——你一直在为随机数生成器播种相同的值!
  • 一旦你修复了srand(),我想你仍然会遇到random = rand() % (20 - 15) + 15;的问题。
  • @FoggyDay:这取决于错字是在代码中还是在范围的声明中。 IIRC,您需要一个模数范围内的+1 来获得 6 个数字 15..20(或 16 个来自 5..20 的数字)。

标签: c


【解决方案1】:

首先,您需要在程序开始时调用 srand() 一次。

接下来,你要替换

srand(12345);

srand (time(NULL));

【讨论】:

  • 这仍然会导致返回相同的数字如果在紧密循环中重复调用 randomnumbergen()
  • @EricJ。是的,但至少比每次都使用相同的数字领先一步。
  • @JonathanLeffler:我认为它更糟,因为不考虑时间因素的函数的单元测试很可能表明它“工作”,而在循环中使用时会失败。实际上,该错误被更好地隐藏了。
【解决方案2】:

您每次都使用相同的种子 - 产生相同的结果。您不需要对其进行硬编码。

【讨论】:

  • 但是删除对srand() 的调用也会使结果具有确定性,尽管顺序不同。您每次都需要使用不同的号码拨打srand()。考虑从/dev/urandom 读取一个随机数。
  • 观察结果是正确的,建议的解决方案是系统特定的。
  • @EricJ。建议的解决方案适用于大多数现代的 Unix 变体(Mac OS X,我今年测试过的 Linux;我认为它适用于 Solaris,但我已经有几年没有使用它了——我不确定HP-UX 和 AIX)。据我所知,没有更便携的解决方案来获得相当好的随机种子。
  • @JonathanLeffler:C 也适用于 Windows、DOS 和不基于 Linux 的嵌入式系统。该问题未标记 Linux。
  • 好吧,你必须记住,C 也可以在 Windows 上运行......
猜你喜欢
  • 1970-01-01
  • 2020-06-07
  • 1970-01-01
  • 1970-01-01
  • 2012-01-20
  • 1970-01-01
  • 2012-03-18
  • 2015-07-19
相关资源
最近更新 更多