1

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

4

3 回答 3

1

改变

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

casovi = (sekundi / 3600.0);
minuti = (sekundi / 60.0);
于 2013-10-16T16:07:31.943 回答
1

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

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

    casovi = (sekundi / 3600.0);
    
于 2013-10-16T16:03:33.850 回答
1

我怀疑,当您使用两个在数字上彼此接近的种子初始化生成器时,生成的序列中的第一个数字也可能在数字上接近。然而,人们希望在此之后序列会很快分化。

在我的环境中,丢弃第一个数字似乎有帮助:

long sekundi;
srand(time(NULL));
rand(); // <<<<< THIS
sekundi = rand();

当然,如果您在同一秒内运行代码两次,生成器仍将使用完全相同的值作为种子,并且两次都将获得完全相同的输出。如果这是一个问题,您可能应该使用更高分辨率的计时器来生成种子。

至于您问题的另一方面,您似乎想使用浮点而不是整数除法:

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

(注意在.数字文字末尾添加的。)

于 2013-10-16T15:59:58.557 回答