2010-08-26 44 views
0

我有一些函數可以產生double,float,short,long的隨機值。我有另一個我傳遞數據類型的函數,它應該返回一個隨機值。現在我需要在該函數中選擇基於傳遞的數據類型的返回值。例如,如果我通過浮動,我需要:如何根據一定的概率獲得一個值

返回是浮動的概率是70%,返回是雙倍,短或長的概率各爲10%。我可以調用另一個函數來生成相應的隨機值,但我如何適應最終回報的概率權重?我的代碼是用C++編寫的。

讚賞一些指針。

謝謝。

回答

3

C++隨機數有uniform distribution。如果需要另一個distributionrandom variables,則需要將其數學公式基於均勻分佈。

如果你沒有一個數學公式爲您隨機變量,你可以做這樣的事情:

int x = rand() % 10; 
if (x < 7) 
{ 
// return float 
} 
else (if x == 7) 
{ 
// return double 
} 
else (if x == 8) 
{ 
// return short 
} 
else (if x == 9) 
{ 
// return long 
} 
+0

您提出了一個有趣的觀點。我認爲基於一些概率分佈的數學公式是我最終想要做的。還有一些其他的變量,爲了簡單起見,我沒有在我的問題中提到。但就目前而言,您的解決方案正是我所需要的。謝謝! – Manas 2010-08-26 07:41:55

2

我不知道如果我理解你想要做正確的,但如果你只是想以確保概率70-10-10-10,執行以下操作:

  • 在產生一個隨機數r(1,2,3,4,5,6,7,8,9,10 )
  • if r <= 7:float
  • 如果r == 8:短
  • 如果r == 9:雙
  • 如果r == 10:長

我想你認識並能適應模式任意概率值。

+0

我改編了您的和@mmomen的解決方案以適應我的要求。不幸的是,我只能將一個答覆標記爲接受的答案。感謝指針。 – Manas 2010-08-26 07:51:38

1

mmonem有一個很好的概率開關,但返回不同的類型也不是微不足道的。您需要一種可以充分(爲了您的目的)編碼任何值的單一類型 - 檢查boost :: any,boost :: variant,union或轉換爲最有能力的類型(可能是double)或字符串表示形式。

+0

我認爲@Manas正在關注概率問題,因爲問題的標題提出了問題,問題以什麼結束; *'我如何適應最終回報的概率權重?'* – mmonem 2010-08-26 06:37:14

+0

但@Manas似乎也沒有得到回報值的困難。 – Elemental 2010-08-26 07:46:49

+0

全局隨機生成器函數返回_variant_t。這需要處理不同數據類型(double,float,short,long)的返回值。儘管如此,「boost :: any」聽起來很有趣。我想我只是出於好奇才看看。感謝指針。 – Manas 2010-08-26 08:02:06

3

這可以作爲今後參考的可選項可以 得到這樣的99.999%,0.0001%的精確值的概率 要獲得概率(實際百分比)做這樣:

//70% 
double probability = 0.7; 
double result = rand()/RAND_MAX; 
if(result < probability) 
    //do something 

我有使用這種方法來創建非常大的滲透網格,它的工作原理就像精確值的魅力。

相關問題