我需要生成一个随机数秒,然后花几秒钟来计算这些秒的分钟数和小时数。所以,我首先使用rand()生成一个数字,但它似乎有点奇怪,每次运行程序时,随机数(上一个)只增加3.是的,它是随机的,但每次下次运行时仍然只增加3 。如果可能的话,我想让它更随机。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
long sekundi;
srand(time(NULL));
sekundi = rand();
double minuti,casovi;
casovi = (sekundi / 3600);
minuti = (sekundi / 60);
printf("%d \n",sekundi);
printf("%4.2f \n",casovi);
printf("%4.2f \n",minuti);
return 0;
}
这是我的代码,我是C的新手请原谅我的格式和一切。它似乎没有正确计算小时和分钟,它确实正确的第一个数字,然后在没有正确的十进制数字的数字后面添加x,00。
答案 0 :(得分:1)
我怀疑,当您使用两个以数字方式彼此接近的种子初始化您的生成器时,生成的序列中的第一个数字也可能在数值上接近。然而,人们希望在此之后序列会很快发散。
在我的环境中丢弃第一个号码似乎有所帮助:
long sekundi;
srand(time(NULL));
rand(); // <<<<< THIS
sekundi = rand();
当然,如果你在同一秒内运行代码两次,那么生成器仍将以完全相同的值播种,并且两次都会获得完全相同的输出。如果出现这个问题,您应该使用更高分辨率的计时器来生成种子。
至于你问题的另一个方面,你似乎想要使用浮点而不是整数除法:
casovi = (sekundi / 3600.);
minuti = (sekundi / 60.);
(注意数字文字末尾添加的.
。)
答案 1 :(得分:1)
我不知道这是否能回答您的问题,但我认为值得讨论的代码存在两个问题。
您执行整数除法来计算分钟和小时数,然后将其转换为double类型的值。这没有任何意义。如果您想要浮点除法,请尝试以下方法。
casovi = (sekundi / 3600.0);
答案 2 :(得分:1)
更改
casovi = (sekundi / 3600);
minuti = (sekundi / 60);
到
casovi = (sekundi / 3600.0);
minuti = (sekundi / 60.0);