【问题标题】:DIfference in output of srand() on windows gcc and expected output for C programming?Windows gcc 上 srand() 的输出与 C 编程的预期输出的差异?
【发布时间】:2018-11-01 09:10:58
【问题描述】:

我想知道为什么我的 gcc 编译器在 Windows 10 上的 Sublime Text 3 中的输出与预期的输出不同?如果是这样,我该如何更改编译器以使其运行相同?

这是预期的输出,当我使用 https://repl.it/repls/InternalSeveralEntropygcc 4.6.3

时可以收到
The set of numbers are:

1 4 3 3 7 2 3 2 9 9 10 9 5 2 10 7 2 3 1 1 

但是,这是我使用多个 gcc 版本收到的输出,5.4.06.3.08.1.0 甚至4.6.3

The set of numbers are:
2 2 8 6 8 2 3 8 4 6 10 5 9 2 8 10 7 2 1 6

我尝试过搜索,我最接近的理解是它与 srand() 的功能不同有关吗?下面附上我的代码。

    #include <stdio.h>

    #include <stdlib.h>

    int main(void) {

    int N = 20, DATA[20];

    int i; //< you local variables here >

    srand(454646); //don't change this line! Will be used in autograding... You may fail test cases if change this

    for (i = 0; i < N; i++){        //< generate rand numbers and store here in DATA array >
        DATA[i] = rand()%10 + 1;
    }

    printf("The set of numbers are:\n");
    for (i = 0; i < N; i++){
        printf("%d ", DATA[i]);
    }
    printf("\n");

    //< write using FOR loops to determine MODE and print >

    return 0;

}

【问题讨论】:

  • 无关:您需要播种 srand 以产生不错的随机性。
  • 嗯...也许他们应该生成相同的序列。使用 VC2008 它生成了正确的序列。
  • 我相信replit 使用Linux,因此rand 可能使用与在Windows 上运行的ming-gw 的gcc 不同的实现。我不会关注你的随机性与他们的差异。
  • @WedaPashi 请注意,在某些情况下(例如测试),每次生成相同的伪随机序列可能很有用。
  • //不要更改此行!将用于自动评分...如果更改此设置,您可能会失败测试用例哇。创建这个问题的人是否知道来自rand() 的数据是依赖于实现的?如果是这样,那个人是否指定了您必须使用的确切实现(编译器、操作系统、C 运行时库等)?如果不是,那这个人就不明白问题所在。

标签: c gcc random


【解决方案1】:

来自 C11 标准:

7.22.2.1 rand 函数

... 脚注:无法保证生成的随机序列的质量,并且已知某些实现会生成具有令人痛苦的非随机低位比特的序列。具有特殊要求的应用程序应使用已知足以满足其需求的生成器。

这句话清楚地表明randsrand 是实现定义的,程序的顺序(用于评分!)也是实现定义的。

【讨论】:

    【解决方案2】:

    作为 C11 标准的 7.22.2.1 的一部分提到,rand() 函数的输出是实现定义的,因此它可能会根据每个实现(甚至编译器的版本)而改变。

    唯一可以保证的是:

    返回一个介于​0​和 RAND_MAX(0 和 包括 RAND_MAX)。

    这意味着也不能保证均匀分布。

    如果您需要一个生成伪随机数生成器,它可以保证始终创建相同的序列(对于每个种子),您需要自己编写该函数。编写此类函数的一种方法是使用LFSR,或者您可以检查特定版本的rand() 函数的实现,并将其作为应用程序特定的随机函数(如myrand())添加到您的代码中。

    【讨论】:

      猜你喜欢
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-21
      相关资源
      最近更新 更多