簡體   English   中英

根據雙鍵按比例選擇值

[英]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)復雜性。

您可以使用以下之一:

  • lowerEntry
  • ceilingEntry
  • floorEntry
  • higherEntry

現在你只需要以正確的概率提取隨機數。 為此我會參考這篇文章:

如何從指定的離散分布生成隨機數?

如果我理解正確,你要找的是加權隨機。
您應該對所有權重求和,並將其歸一化為整數值,這樣您就可以按照注釋的建議使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM