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