C问题中的新手随机数发生器?

时间:2011-07-28 19:05:10

标签: c random

#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'

我该如何解决?谢谢!

4 个答案:

答案 0 :(得分:8)

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上的这篇文章。

答案 1 :(得分:2)

虽然这不是您确切问题的答案,但它与您的计划非常相关 -

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

我引用课程阅读器:

  

这里的问题是rand()仅保证它产生的值在0到RAND_MAX的范围内均匀分布。但是,不能保证六分之一的剩余部分将是随机的。

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

我想,既然你试图绕过随机数发生器,你可能想知道这一点。

快乐的编码!

答案 2 :(得分:1)

您也可以使用:

srand(time(NULL));

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

答案 3 :(得分:-1)

你可以明确地施展它:

srand((unsigned int)clock());