我需要生成一个秒的随机数,然后取秒并计算这些秒的分钟和小时数。所以,我首先使用 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。
我怀疑,当您使用两个在数值上彼此接近的种子初始化生成器时,生成的序列中的第一个数字也可能在数值上接近。然而,人们希望在那之后序列会很快分化。
在我的环境中,丢弃第一个数字似乎有所帮助:
long sekundi;
srand(time(NULL));
rand(); // <<<<< THIS
sekundi = rand();
当然,如果你在同一秒内运行代码两次,生成器仍将以完全相同的值播种,并且两次都会得到完全相同的输出。如果这是一个问题,您可能应该使用更高分辨率的计时器来生成种子。
至于你问题的另一个方面,你似乎想使用浮点除法,而不是整数除法:
casovi = (sekundi / 3600.);
minuti = (sekundi / 60.);
(请注意数字文本末尾添加的.
。
这是否回答了你的问题,但我认为关于你的代码有两个问题值得讨论。
- 您知道实施RAND_MAX吗?在某些情况下,它可能小至 32767。
执行整数除法以计算分钟和小时数,然后将其转换为双精度类型的值。这没有任何意义。如果要进行浮点除法,请尝试以下操作。
casovi = (sekundi / 3600.0);
更改
casovi = (sekundi / 3600);
minuti = (sekundi / 60);
自
casovi = (sekundi / 3600.0);
minuti = (sekundi / 60.0);