2013-10-16 82 views
1

我需要生成一個隨機數秒,然後採取秒,並計算多少分鐘和幾小時是那些秒。所以,我首先使用rand()生成一個數字,但它似乎有點奇怪,每次我運行程序時,隨機數(前一個)只增加3個。是的,它是隨機的,但每次下一次只增加3 。如果可能的話,我想讓它更隨機。如何計算C中的浮點數?

#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。

+5

再次整數除法罷工。 – harold

+0

你在做整數除法。你需要用花車來劃分。即:3600.0和60.0。 – Max

+0

我做到了這一點,它似乎現在崩潰了程序。對於所有的printf行我會得到3個警告,「格式的參數太少」。 – user2699298

回答

1

我懷疑,當你用兩顆數字相近的種子初始化發生器時,生成序列中的第一個數字也可能在數值上接近。然而,人們會希望,那之後的序列會很快發生分歧。

在我的環境丟棄的第一個數字似乎幫助:

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

當然,如果你在同一秒內運行代碼兩次,發電機仍然會具有完全相同的價值和你播種兩次獲得完全相同的輸出。如果這個問題你應該使用更高分辨率的計時器來生成種子。

至於你的問題的其他方面,它很可能是您要使用浮點,而不是整數,除法:

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

(注意:在數字文字的末尾添加.

+1

爲避免出現同樣的第二個問題,特別是在多線程場景中,將_pid_或_tid_添加到當前時間也很有用。 – rodrigo

1

我不知道這是否回答你的問題,但有兩個關於你的代碼的問題我認爲值得討論。

  1. 你知道你的實現的RAND_MAX嗎?在一些情況下,它可能小到32767.
  2. 你做整數除法來計算分鐘和小時,然後你把它轉換爲double類型的值。這沒有任何意義。如果你想浮動分割,請嘗試以下操作。

    casovi = (sekundi/3600.0); 
    
+0

我不知道RAND_MAX值,但即使升至32677也可以。已經修復了浮動問題!謝謝。 – user2699298

1

變化

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

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