【问题标题】:rand() behaves differently between macOS and Linuxrand() 在 macOS 和 Linux 之间的行为不同
【发布时间】:2020-11-04 12:24:22
【问题描述】:

我正在尝试使用 rand() 生成一个随机数序列。 我有这样的事情:

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


int Random(int min, int max)
{
  /* returns a random integer in [min, max] */

  double uniform; // random variable from uniform distribution of [0, 1]
  int ret; // return value
  srand((unsigned int)clock());

  uniform = rand() / (double)RAND_MAX;
  ret = (int)(uniform * (double)(max - min)) + min;

  return ret;
}


int main(void)
{
  for(int i=0; i<10; i++)
    printf("%d ", Random(0, 100));
  printf("\n");

  return 0;
}

macOS v10.14 (Mojave) 和 Ubuntu 18.04 (Bionic Beaver) 上执行时会产生不同的结果。

它适用于 Ubuntu:

76 42 13 49 85 7 43 28 15 1

但不是在 macOS 上:

1 1 1 1 1 1 1 1 1 1

为什么它在 macOS 上不能正常工作?随机数生成器有什么不同吗?

【问题讨论】:

  • 你必须调用 srand() 一次:stackoverflow.com/questions/46877089/…
  • 另外,clock() 通常是从程序执行开始的计数。将time() 传递给srand() 更为常见。 C18 标准提到了 clock()7.27.2.1 实现对程序使用的处理器时间的最佳近似,因为实现定义的时代开始时仅与程序相关调用。
  • 我觉得clock()这个函数在macos上表现的很奇怪,能不能每次用的时候显示一下它的值?
  • srand() — why call it only once?。而且mac上的rand()太烂了,你应该用arc4random()代替,见Why does rand() % 7 always return 0?Rand() % 14 only generates the values 6 or 13
  • 除了其他 cmets,您的 Mac 实现的运行速度可能比您的 ubuntu 实现快得多。也许您正在 Mac 上的虚拟机中运行 ubuntu?

标签: c random


【解决方案1】:

我是 Mac 用户。为了生成随机数,我像这样初始化种子:

srand(time(NULL));

另外,尝试在你的 main 中初始化它。

【讨论】:

    【解决方案2】:

    如果您关心可重现的“随机”数字,则应避免使用 rand 函数。即使种子是通过srand 给出的,C 标准也没有具体说明rand 产生的序列是什么。值得注意的是:

    相反,您应该使用具有已知算法的伪随机数生成器的实现,并且您还应该依靠自己的方式将伪随机数从该算法转换为您想要的数字。 (有关这样做的许多方法,请参阅my page on sampling algorithms。请注意,当可重复性很重要时,还有other things to consider。)

    另请参阅以下内容:

    【讨论】:

      【解决方案3】:

      rand 在 Mac 中已过时。请改用 random()。

      【讨论】:

      • 你能解释为什么(通过编辑你的答案)吗?为什么Linux和Mac之间会有所不同?在封面下不是一样的(例如,GCC)吗(不是反问)?即使它已经过时,为什么rand 会给出一个非随机的数字序列?
      猜你喜欢
      • 1970-01-01
      • 2015-09-15
      • 2018-10-23
      • 1970-01-01
      • 2020-03-21
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      • 2013-12-01
      相关资源
      最近更新 更多