我有一些函數可以產生double,float,short,long的隨機值。我有另一個我傳遞數據類型的函數,它應該返回一個隨機值。現在我需要在該函數中選擇基於傳遞的數據類型的返回值。例如,如果我通過浮動,我需要:如何根據一定的概率獲得一個值
返回是浮動的概率是70%,返回是雙倍,短或長的概率各爲10%。我可以調用另一個函數來生成相應的隨機值,但我如何適應最終回報的概率權重?我的代碼是用C++編寫的。
讚賞一些指針。
謝謝。
我有一些函數可以產生double,float,short,long的隨機值。我有另一個我傳遞數據類型的函數,它應該返回一個隨機值。現在我需要在該函數中選擇基於傳遞的數據類型的返回值。例如,如果我通過浮動,我需要:如何根據一定的概率獲得一個值
返回是浮動的概率是70%,返回是雙倍,短或長的概率各爲10%。我可以調用另一個函數來生成相應的隨機值,但我如何適應最終回報的概率權重?我的代碼是用C++編寫的。
讚賞一些指針。
謝謝。
C++隨機數有uniform distribution。如果需要另一個distribution的random 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
}
我不知道如果我理解你想要做正確的,但如果你只是想以確保概率70-10-10-10,執行以下操作:
r
(1,2,3,4,5,6,7,8,9,10 )r <= 7
:floatr == 8
:短r == 9
:雙r == 10
:長我想你認識並能適應模式任意概率值。
我改編了您的和@mmomen的解決方案以適應我的要求。不幸的是,我只能將一個答覆標記爲接受的答案。感謝指針。 – Manas 2010-08-26 07:51:38
mmonem有一個很好的概率開關,但返回不同的類型也不是微不足道的。您需要一種可以充分(爲了您的目的)編碼任何值的單一類型 - 檢查boost :: any,boost :: variant,union或轉換爲最有能力的類型(可能是double)或字符串表示形式。
這可以作爲今後參考的可選項可以 得到這樣的99.999%,0.0001%的精確值的概率 要獲得概率(實際百分比)做這樣:
//70%
double probability = 0.7;
double result = rand()/RAND_MAX;
if(result < probability)
//do something
我有使用這種方法來創建非常大的滲透網格,它的工作原理就像精確值的魅力。
您提出了一個有趣的觀點。我認爲基於一些概率分佈的數學公式是我最終想要做的。還有一些其他的變量,爲了簡單起見,我沒有在我的問題中提到。但就目前而言,您的解決方案正是我所需要的。謝謝! – Manas 2010-08-26 07:41:55