2013-04-14 129 views
-1

我有一個包含不同選擇概率的數組。例如:數組的概率C++

數組1具有{5,3,2,7,1}個值。選擇「0」有5/18的選擇機會,選擇「1」有3/18的機會..等等。 「18」是數組值的總和。

這裏是我的代碼(在這種情況下,我們有8種選擇):

int i = rand() % sumofvaluesofarray; //edited from array_size 
int c = 0; 
int sum = 0; 
while(c < 8){ 
    sum += array[c]; 
    if(i < sum){ 
     choice = c; 
     break; 
    } 
    c += 1; 
} 

這是一個非工作計劃的一部分,但我懷疑問題出在這部分代碼。它有什麼問題嗎?無論如何更有效地編寫代碼?

+0

「問題出在這部分代碼上」。什麼問題? –

+0

退房'' –

+0

請不要繼續編輯代碼。確保你已經發布了你正在編譯的代碼。問題是什麼?你有錯誤嗎?如果是這樣,那是什麼? –

回答

3

提問者不斷更改他們的代碼。請注意將來的問題提問者:請在編譯時準確地發佈您的代碼。

好像你有幾個問題。首先,你應該創建一個隨機數高達18,而不是數組的大小:

int i = rand() % 18; 

請注意,這並不一定按照均勻分佈給你i(僅當會是RAND_MAX 18的倍數)。

此外,您在循環c多達8個,而不是供它應該是5:

while(c < 5){ 

否則,你正在訪問的array範圍之外。

你也可以在這條線FULLWIDTH SEMICOLON Unicode字符(U + FF1B):

sum += array[c]; 
//   ^

你從一個文檔複製它,也許?確保它是一個正常的SEMICOLON字符(U + 003B)。

如果您使用的是C++編譯器11,你可以停止關心如何有效地寫這個,只是利用<random>頭的:

std::random_device rd; 
std::mt19937 gen(rd()); 
std::discrete_distribution<> d(std::begin(array), std::end(array)); 

有了這個,你可以生成隨機值根據離散分佈調用d(gen)

+0

我編輯了我的問題以反映您指出的內容。我看「c」達到8,因爲這次我們有8個選擇,因此array [0] -array [7]包含我8個選擇的概率數字。另外我剛剛開始學習C++,所以我不熟悉你的第二個建議,特別是格式。 – kir

+0

@ user2280704那麼問題是什麼?你還沒有告訴我們。如果您發現錯誤,請告訴我們它是什麼。如果它不符合你的期望,請告訴我們它在做什麼。 –

+0

我的問題是我在調試我的程序時遇到了問題。這段代碼只是我程序的一小部分,我想知道這段代碼是否有問題。基本上我的主要問題是我不確定如何在我的程序中實現概率概念,並且我要求澄清我是否正確地做了這件事。 – kir

2
int i = rand() % size_array; 
int c = 0; 
int sum = 0; 
while(c < 8){ 
    sum += array[c]; // Missing semicolon 
    if(i < sum){ 
    choice = c; 
    break; 
    } 
    c += 1; 
} 

您錯過了那裏的分號。

0

如果您想知道代碼中的算法是否正常工作,請將其寫入函數併爲其創建unit tests。通過這種方式,您可以爲函數提供預定義的一組參數,這些參數可以與預期結果進行比較。現在,當您進入調試會話時,您可以合理地假設該功能正常工作,然後您可以專注於代碼的其他區域。

+0

是的,我只是這樣做,發現我的程序的這部分工作。謝謝。 – kir