C问题中的新手随机数生成器? #包括 #包括 #包括 int main(int argc,const char*argv[]{ srand(clock()); int num=rand()%6+1; printf(“%i”,num); 返回0; }

C问题中的新手随机数生成器? #包括 #包括 #包括 int main(int argc,const char*argv[]{ srand(clock()); int num=rand()%6+1; printf(“%i”,num); 返回0; },c,random,C,Random,我在“srand(clock());”行中得到了这个警告 警告:隐式转换将丢失整数精度:“clock_t”(又名“unsigned long”)转换为“unsigned int” 我怎么修理它?谢谢 您可以显式强制转换它: #include <stdio.h> #include <stdlib.h> #include <time.h> int main(int argc, const char *argv[]) { srand(clock());

我在“srand(clock());”行中得到了这个警告

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


我怎么修理它?谢谢

您可以显式强制转换它:

#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((unsigned int)clock());
这将消除可能的(极不可能的)重复项。

更好的种子:

  • 使用time(NULL)获取一天中的时间并将结果强制转换为seed srand()

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

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


您还应该在US-CERT上阅读这篇文章。

虽然这篇文章不是对您的确切问题的回答,但它与您的课程非常相关——

我读到
int num=rand()%6+1
不是获取1到6之间随机数的正确方法

我引述课程读者的话:

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

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

我想既然你想了解随机数发生器,你可能想知道这个


快乐编码

为了澄清一点,clock()测量自程序开始执行以来的CPU时间。与@0A0D链接到的程序相比,这对您的简单程序来说是一个更大的问题;由于
srand(clock())
是程序执行的第一件事,因此clock()每次都可能返回0。这取决于程序的使用方式。如果程序在一秒钟内运行两次,
time(NULL)
可能会给您相同的值。C rand()实现通常不足以用于生成严重的随机数(尽管它们可能适合某些游戏)。
srand(time(NULL));