2013-03-21 344 views
0

我在我的書中以下問題:隨機數生成機制

#include<iostream.h> 
#include<conio.h> 
#include<stdlib.h> 
void main() 
{ 
    clrscr(); 
    randomize(); 
    int Game[]={10,16},P; 
    int Turn=random(2)+5; 
    for(int T=0;T<20;T++) 
     { 
      P=random(2); 
      cout<<Game[P]+Turn<<"#"; 
     } 
getch(); 
} 

輸出來像16#22#16#16#16#22#.... 20倍... 爲什麼這個輸出總是來自16#或22#?爲什麼不15#或21#?我想這個程序的機制。謝謝。 turn = random(2)+5; 如果random(2)給出0,那麼turn變成turn = 0 + 5 = 5這意味着我應該得到10 + 5 = 15和16 + 5 = 21以及16和22,但是我沒有得到它們。

我們在我們的計算機科學理論考試中得到了上述問題,我們選擇了正確的答案(即它產生了16和22),但我將如何知道它將只產生16和22。上述15和21解釋也是可以的..

+1

'randomize()'做了什麼? – Kevin 2013-03-21 14:06:59

+0

此代碼不會在現代C++編譯器上編譯(並且從來沒有有效的C++代碼!),這導致我認爲您確實需要升級您的工作環境。 – 2013-03-21 14:08:30

+0

我使用turbo C++進行快速編譯 – Smatik 2013-03-21 14:14:06

回答

0

因爲Turn只是隨機化一次 - 在循環的開始。如果移動的Turn分配到你的循環,你應該得到1521也:

#include<iostream.h> 
#include<conio.h> 
#include<stdlib.h> 
void main() 
{ 
    clrscr(); 
    randomize(); 
    int Game[]={10,16},P; 
    int Turn; 
    for(int T=0;T<20;T++) 
     { 
      P=random(2); 
      Turn=random(2)+5; 
      cout<<Game[P]+Turn<<"#"; 
     } 
    getch(); 
} 

而且,有人說了,如果你想輸出運行之間的不同,你需要種子的隨機號碼發生器,例如通過呼叫seed。例如:

#include <time.h> 
(...) 
srand(time(NULL)); 
+0

int Turn = random(2)+5;如果random(2)給出零,那麼turn的值就變成(turn = 0 + 5)5。那麼我應該得到15和21 ..但我沒有得到它! – Smatik 2013-03-21 14:15:47

+0

是的,但是由於您的隨機生成器沒有種子,您將始終從運行中獲得相同的值以運行。用不同的值對它進行種子處理(例如使用'time(NULL)'),並且你應該看到不同。然而,如果不移動「Turn」的分配,你總是會得到包含16和22或15和21的運行。 – sonicwave 2013-03-21 14:22:35

+0

我永遠不會得到15和21.總是16和22 .. – Smatik 2013-03-21 14:24:15

1

你需要給一個seed值,這將有助於得到「真」隨機的。數字

1

計算機不能自行隨機化數字,它使用它的種子。

但是種子的不完全隨機的,他們只是有一個特定的順序,如:

1 
2 
8 
5 
4 

這些數字看起來很隨機的,但是當你運行該程序下一次您將獲得:

1 
2 
8 
5 
4 

完全一樣。

爲了防止發生這種情況,我們使用時間作爲種子,時間總是變化,所以它會始終生成新的數字。

#include <time.h> 
srand(time(NULL)); // srand is the function to randomize numbers from a seed, we use 'time' as seed here 

this video解釋它。