【问题标题】:Newbie random number generator in C question?C问题中的新手随机数生成器?
【发布时间】:2011-07-28 19:05:09
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, const char *argv[]) {
    srand(clock());
    int num = rand() % 6 + 1;

    printf("%i", num);
    return 0;
}

我在“srand(clock());”中收到此警告线。

警告:隐式转换会丢失整数精度:“clock_t”(又名“unsigned long”)到“unsigned int”

我该如何解决?谢谢!

【问题讨论】:

    标签: c random


    【解决方案1】:

    Don't use srand(clock()) use srand((unsigned)time(NULL)) instead.

    更好的种子:

    • 使用 time(NULL) 获取一天中的时间并将结果投射到种子 srand().

    • time(NULL) 返回自午夜以来经过的秒数 1970 年 1 月 1 日。

    • 使用 rdtsc() 获取 CPU 时间戳并将结果转换为种子 srand()。 rdtsc() 不太可能返回重复值,因为它返回 指令数
      自启动以来由处理器执行。

    您还应该通过 US-CERT Secure Coding on how properly seed 阅读这篇文章。

    【讨论】:

    • 澄清一点,clock() 测量程序开始执行以来的 CPU 时间。对于您的简单程序来说,这比@0A0D 链接的程序更成问题;因为srand(clock()) 是你的程序做的第一件事,clock() 很可能每次都返回 0。
    【解决方案2】:

    虽然它不是您确切问题的答案,但它与您的程序非常相关 –

    我在Stanford CS106 Course Reader available in PDF 中读到int num = rand() % 6 + 1; 不是获取 1 到 6 之间随机数的正确方法。

    我引用课程阅读器:

    这里的问题是rand() 只保证它产生的值均匀分布在从 0 到 RAND_MAX 的范围内。但是,不能保证除以 6 的余数完全是随机的。

    他们还解释了如何正确执行此操作,这涉及四个不同的步骤(标准化 - 缩放 - 转换 - 转换)。

    我想既然您正试图了解随机数生成器,您可能想知道这一点。

    编码愉快!

    【讨论】:

      【解决方案3】:

      你也可以使用:

      srand(time(NULL));
      

      这将消除可能的(极不可能的)重复。

      【讨论】:

      • 这取决于程序的使用方式。如果程序在一秒钟内运行两次,time(NULL) 很可能会为您提供相同的值。 C rand() 实现通常不足以用于严重随机数生成(尽管它们可能适用于某些游戏)。
      【解决方案4】:

      你可以显式地转换它:

      srand((unsigned int)clock());
      

      【讨论】:

        猜你喜欢
        • 2017-04-10
        • 2013-10-21
        • 1970-01-01
        • 2016-05-26
        • 2018-01-03
        • 1970-01-01
        • 1970-01-01
        • 2011-05-18
        • 1970-01-01
        相关资源
        最近更新 更多