簡體   English   中英

如何在Java中保持多次執行的概率

[英]How can I maintain probability across multiple executions in Java

首先,我在數學方面不是最出色的,所以請原諒與此有關的任何無知。 我試圖在多個執行中保持基於概率的隨機性,但是我失敗了。 我在JSONObject中有此輸入

{
   "option1": 25,
   "option2":25,
   "option3" :10,
   "option4" :40
}

這是我的函數,根據分配的概率從上述JSONObject中選擇一個值:

public static String selectRandomoptions(JSONObject options) {
    String selectedOption = null;

    if (options != null) {

        int maxChance = 0;
        for (String option : options.keySet()) {
            maxChance += options.getInt(option);
        }

        if (maxChance < 100) {
            maxChance = 100;
        }

        Random r = new Random();
        Integer randomValue = r.nextInt(maxChance);

        int chance = 0;
        for (String option : options.keySet()) {
            chance += options.getInt(option);
            if (chance >= randomValue) {
                selectedOption = options.toLowerCase();
                break;
            }
        }
    }
}

如果我在一次執行中調用它x次(測試了100次以上),該函數的行為就在合理的誤差范圍內,問題是我每小時運行一次,以在事件驅動的應用程序中生成一些示例數據以進行驗證我們的分析過程/數據,但我們需要至少在合理范圍內可預測的東西?

有誰知道我該如何處理? 我寧願不必堅持任何措施,但我不反對這樣做,如果這樣做有意義或減少了復雜性/時間。

Random.nextInt()返回的值是均勻分布的,因此這不應該成為問題。

我想使隨機結果可重復,那么您可能要對種子使用Random

不必每次需要一個新的隨機數時都創建一個新的Random()對象,而是每次運行一次創建Random對象,然后每次運行一次使用Random.nextInt()對象。

查看Random()構造函數的文檔,

這個構造函數將隨機數生成器的種子設置為一個很可能與該構造函數的任何其他調用不同的值,它僅保證它是不同的

這比您從nextInt()獲得的合同nextInt()

如果要在每次運行中獲得相同的數字序列,請使用隨機對象的Random(long seed)setSeed(long seed)方法。 這兩種方法都設置了生成器的種子。 如果每次調用使用相同的種子,則可以確保從生成器中獲得相同的數字序列。 Random.setSeed(long)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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