[英]Selecting a value proportionally based on its double key
我有一個值列表,鍵入0到1之間的雙精度,表示我認為對我來說有用的東西的可能性。 例如,要獲得問題的答案:
0.5 call your mom
0.25 go to the library
0.6 StackOverflow
0.9 just Google it
所以,我們認為谷歌搜索它(約)是問你媽媽的兩倍。 當我試圖弄清楚接下來要做的事情時,我希望“只是谷歌它”的回報頻率是“打電話給你媽媽”的兩倍。
我一直在尋找解決方案,但收效甚微。 我發現的大多數東西都依賴於整數鍵(比如如何根據地圖中的整數值隨着O(n)時間內的其他值隨機選擇一個鍵? ),我不知道有,我不能輕易生成。
我覺得應該有一些Java數據類型可以為我做這件事。 有什么建議么?
您可以考慮基於Java接口NavigableMap的解決方案,如果使用TreeMap實現,您將始終獲得O(logn)復雜性。
您可以使用以下之一:
現在你只需要以正確的概率提取隨機數。 為此我會參考這篇文章:
如果我理解正確,你要找的是加權隨機。
您應該對所有權重求和,並將其歸一化為整數值,這樣您就可以按照注釋的建議使用rand.nextInt。
例如,可以通過乘以100來完成標准化,因此您的標准化權重現在是:
50,25,60,90 - 總和是225。
你應該定義范圍:
0 - 49代表“打電話給你的媽媽”
50 - 74 - 用於“去圖書館”
現在你需要執行this.rand.nextInt(sum) - 並得到一個值,
並且此值應映射到其中一個已定義的范圍。
如果您跟蹤概率的總值,您可以執行以下操作:
double interval = 100;
double counter = 0;
double totalProbabilities = 2.25;
int randInt = new Random().nextInt((int)interval);
for (Element e: list) {
counter += (interval * e.probability() / totalProbabilities);
if (randInt < counter) {
return e.activity();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.