如何在 C 中计算浮点数



我需要生成一个秒的随机数,然后取秒并计算这些秒的分钟和小时数。所以,我首先使用 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.);

(请注意数字文本末尾添加的.

我不知道

这是否回答了你的问题,但我认为关于你的代码有两个问题值得讨论。

  1. 您知道实施RAND_MAX吗?在某些情况下,它可能小至 32767。
  2. 执行整数除法以计算分钟和小时数,然后将其转换为双精度类型的值。这没有任何意义。如果要进行浮点除法,请尝试以下操作。

    casovi = (sekundi / 3600.0);
    

更改

casovi = (sekundi / 3600);
minuti = (sekundi / 60); 

casovi = (sekundi / 3600.0);
minuti = (sekundi / 60.0);

最新更新