2010-04-15 48 views
8

我有一個結構數組,並且結構中的一個字段是一個浮點數。我想選擇其中一個結構,其中選擇它的概率是相對於浮動的價值。即C++函數用於從列表中選取每個元素具有明顯概率的列表

struct s{ 
    float probability; 
    ... 
} 

s sArray[50]; 

什麼是決定選擇哪個最快的方法?有這個功能嗎?如果我知道所有概率字段的總和(注意它不會是1),那麼我是否可以遍歷每個s並將probability/total_probability與隨機數進行比較,並更改每個s的隨機數?即

if((float) (rand()/RAND_MAX) < probability)... 

回答

9
float p = (rand()/static_cast<float>(RAND_MAX)) * total_probability; 
s* current = &sArray[0]; 
while ((p -= current->probability) > 0) 
    ++current; 
// `current` now points to your chosen target 
+0

s->概率應該是當前 - >概率,正確嗎? – Stuart 2010-04-16 00:03:26

+0

'rand()/ static_cast (RAND_MAX)'將始終爲0(非常高的概率)或1(非常低的概率)。你可以試試'rand()/ static_cast (RAND_MAX)'。 – 2010-04-16 00:35:34

+0

我用過:'(float)((float)rand()/ RAND_MAX)' 它適用於我。 – Stuart 2010-04-16 00:51:27

3

如您所說找出RAND_MAX。 生成一個最大爲RAND_MAX的隨機數。 迭代整個數組,計算概率,直到等於或超過生成的隨機數。 (只有50元的表現不應該是一個問題,否則存儲在另一個數組的概率一度的總和,然後做一個分搜索到,對於隨機值)。

+0

精確優化取決於如何與選擇隨機元素的頻率相比,陣列通常會被修改,而且過早優化無論如何都是一個糟糕的計劃。也就是說,在構建和修改數組時,可以保持RAND_MAX爲最新狀態,因此每次選擇一個隨機元素時都不必重新計算它。您還可以存儲累積概率,以便不必遍歷並添加單個概率,而只需對累積概率執行二分搜索。 – Cascabel 2010-04-15 23:51:53

+0

@Jefromi - 我只是加了一點點的答案!你的評論真的很快! – 2010-04-15 23:53:16

+0

概率將經常變化。隨機選取兩個對象,然後數組中的一個或兩個對象可能會更改。這發生了很多次。 – Stuart 2010-04-15 23:58:26

相關問題