2015-12-23 42 views
-1

問題看起來有點不可思議,我接受。我怎樣才能讓模擬結果顯示在輸出之上呢?

我想問的是這樣的:

int main(){ 
srand(time(NULL)); 
for(int x=0;x<10000;x++){ 
int result = rand()%2; 
if(result==0) cout << "Heads" << endl; 
if(result==1) cout << "Tails" << endl; 
return 0; 
}} 

所以我想要做的是模擬一個巨大的拋硬幣的量。輸出將是這樣的:

Heads 
Heads 
Heads 
Tails 
Heads 
Tails 
Tails 
.... 

但是我要像

總數首腦= 4900,尾= 5100最長首腦連勝= 7,尾 連勝聲明= 8

頂部的輸出。我該怎麼做?由於循環涉及cout最好,我所能做的就是將語句放在輸出的底部。

編輯:我設法通過使用數組來解決這個問題。我首先使用一個循環並模擬拋出並通過將它們分配給數組元素來記錄它們,然後使用另一個循環按照我需要的順序打印它們。感謝所有的答案,把他們都提升了。

+2

調查控制檯GUI庫的時間。 ncurses,任何人? –

+1

簡單的解決方案是隻打印你想要的東西,這是你的例子語句。不要打印每個硬幣翻轉的結果。 –

+2

爲什麼不把它寫入文件?那麼你可以打印結果,然後打印文件? –

回答

2

您將需要跟蹤(存儲)每個投幣的結果。折騰完畢後,打印您的總結,然後打印每個投擲硬幣的結果。

由於每個硬幣或者是headstails,你可以代表headsfalsetails爲真。這允許你使用一個容器bool

此外,只有兩個值,所以你可以將它們表示爲位。假設雲臺爲1,雲臺爲零。 C++語言有一個名爲bitset的結構,它可以有效地存儲這些位,直到拋棄完成。

當打印結果時,通過bitset容器迭代。如果值爲1,則打印「正面」;否則打印「尾巴」。簡單。快速。

2

最簡單的解決方案是跟蹤bitset中的投擲結果,顯示頭部和尾部的數量,然後遍歷bitset,每個顯示頭1和每個零的尾部。

+0

我想到了這一點,但我對每個結果都有更多的信息。 – SarpSTA

+1

你想顯示什麼信息?它可以存儲在一個數組或矢量?它會佔用太多的內存嗎? –

2

您是否真的需要繼續打印HeadsTails

爲什麼不只保留兩個計數器。即

int main(argc, char* argv[]) 
{ 
    // Keep track of heads/tails counts 
    int heads = 0, 
    int tails = 0, 

    srand(time(NULL)); 
    for (int x=0; x < 10000; x++){ 
     int result = rand()%2; 
     if (result == 0) heads++; 
     if (result == 1) tails++; 
    } 

    // print results  
    printf("Heads=%d, Tails=%d otherstuff=TODO\n", heads, tails); 
    return 0; 
} 

跟蹤其他變量的尾巴或頭部條紋。你需要 正面/反面的最大值爲零。還有一個變量可以說明當前連勝的長度,以及您目前是在觀察頭部還是尾部。

如果你真的想要打印出頭部/尾部,你可以像@Arthur Laks建議的那樣做一些點點滴滴的想法,或者使用一個char數組,以便不需要處理位集。或者你可以將結果寫入文件並讀回來,這很難看。有很多方法可以做到這一點。


對於數組方法是這樣的。

char* results = new char[10000]; 
char* p = results; 

在循環內部。爲了表示負責人:

p[x] = 'H'; 

對於尾巴:

p[x] = 'T'; 

您可以通過數組再次,如果需要,如果需要計算其他統計模式,然後運行。

這就是我要說的一切,因爲我認爲如果我給你一個完整的答案,你什麼都沒學到。

+0

我需要打印它們,或將它們流式傳輸到一個文件中。我需要每個單獨投擲的結果以及統計模式。 – SarpSTA

+1

我想你剛剛回答了你自己的問題。你確實知道答案。所以繼續吧。 :) – Matt

相關問題