【问题标题】:c++ random numbers not randomc++ 随机数不是随机的
【发布时间】:2016-09-08 03:51:38
【问题描述】:

我正在尝试使用 c++ 生成随机数,但它们似乎不是很随机。我当然知道它们只是伪随机,但我发现实际上甚至没有将其切割为伪随机。这是我的代码

#include <iostream>
#include <time.h>

int main(){
    srand (time(NULL));
    std::cout << (double) rand() / (double) RAND_MAX;
    return 0;
}

我编译和运行这个 cpp 文件得到的结果总是以 0.63 开头,后面跟着一些看似随机的数字。

我有什么遗漏吗?我没有使用 srand 正确初始化随机数生成器吗?为什么数字在 0 和 1 之间不是随机的?

谢谢

【问题讨论】:

  • 您能否添加您认为缺少的随机数样本?还有你在什么平台上运行?
  • rand() 返回一个介于 0 和 RAND_MAX 之间的数字,而不是 0 和 1。RAND_MAX 被定义为“至少 32767”。例如,假设 RAND_MAX 是 2147483647,那么 rand() 必须返回大约介于 1352914697 和 1372242050 之间的值,以便您的计算产生介于 0.630 和 0.639 之间的结果。这是一个相当大范围的随机数。另一方面,您使用的是旧的 C rand() 函数,而您应该使用 C++ 自己的 random number generators
  • @RemyLebeau 查看微软版本的RAND_MAX。很郁闷。
  • 也使用#include &lt;stdlib.h&gt;

标签: c++ random


【解决方案1】:

看起来rand 在您的编译器上的实现很差,其中初始随机值高度依赖于种子值。在开始使用返回值之前,您可以生成并丢弃多个随机值。

或者,最好不要打电话给rand。使用&lt;random&gt; 标头提供的功能。

【讨论】:

  • 我从经验知道微软的rand有这个属性。
【解决方案2】:

你可以试试this:

struct timeval;
gettimeofday(&time, NULL);
srand(hash3(time.tv_sec, time.tv_usec, getpid()));

哈希3:

unsigned int hash3(unsigned int h1, unsigned int h2, unsigned int h3)
{
    return ((h1 * 2654435789U) + h2) * 2654435789U) + h3;
}

【讨论】:

    【解决方案3】:

    根本问题是rand() 被 C 手册描述为“错误的随机数生成器”。您应该改用 &lt;random&gt; 库。见

    What difference between rand() and random() functions?

    此外,不清楚您是否有意仅将生成器播种后生成的第一个值与srand() 进行比较,但通常,伪随机数生成器通过播种一次然后生成一系列数字来使用。

    【讨论】:

      猜你喜欢
      • 2011-11-07
      • 2014-04-27
      • 2015-09-10
      • 1970-01-01
      • 2012-10-04
      • 1970-01-01
      • 1970-01-01
      • 2013-11-12
      • 2016-11-07
      相关资源
      最近更新 更多