2014-03-02 53 views
2

我在這裏發佈和math.stackexchange.com之間撕裂,但選擇在這裏,因爲它與編程有關,我以前沒有使用math.stackexchange.com如何計算基於百分比的丟棄率

基本上我有6個不同的項目,我想根據百分比'降',但我不知道如何去實現這個。數學不是我的強項,也不是沒有幫助。

無論如何,是用於通過6項1的百分比如下:

1%, 0.85%, 0.1%, 0.05%, 0.01%, 0.001%

所以項目1具有1%的機率下降,第2項具有0.85%的機率下降等

而且我希望每次運行1個物品,如果這些「機會」都不符合,那麼將會使用默認物品。考慮這些6項獎勵物品。

到目前爲止,我已經試過這樣:

 Random rn = new Random(); 

    int x = rn.nextInt(100)+1; 

    if(100%x==0)//1% 
    { 

    } 
    if(100%(x*100)==0) //0.1% 
    { 

    } 

這似乎不是一個公平的計算如下:

Random rn = new Random(); 

    int x = rn.nextInt(100000)+1; 

    if(100%x==0)//1% 
    { 

    } 
    if(8500%x==0) //0.1% 
    { 

    } 

這似乎更糟。

我正在考慮爲每個物品使用隨機數,但這就是很多RNG,因爲它會在遊戲循環中運行。

我試圖保持這個問題儘可能直接,以避免爭論等,所以我不尋找最好的解決方案,只是一個工程 - 如果需要任何其他信息,我很高興回答只要是N2K幫我解決這個問題=)

+0

還有https://gamedev.stackexchange.com/ – ajp15243

+0

哦,我沒有意識到!謝謝,我會在那裏提出我的問題! =) – Timmy

回答

5

生成的每一個機會,隨機數是好辦法:

double[] chances = {1, 35, 0.85, 50, 0.1, 0.05, 0.01, 0.001, 65, 11}; 
    Random r = new Random(); 
    boolean dropped = false; 
    for (int i = 0; i < chances.length; i++) { 
     if (chances[i] > r.nextDouble() * 100) { 
      System.out.println("Item with " + chances[i] + " chance is dropped"); 
      dropped = true; 
      break; 
     } 
    } 
    if (dropped == false) { 
     System.out.println("Dropping default item"); 
    } 

請注意,只要因爲你只能放下一個項目,元素的順序很重要。

例如,您有5件商品的價格下降了99%。從邏輯上看,第五項只有(0.01^4)* 0.99的機率下降。

+0

@JBNizet - 謝謝 – libik

+0

感謝您的實施示例 – Timmy

+0

@Timmy - 不客氣,我添加了一個解決方案+重要注意事項,您應該考慮一下:) – libik

3

我會產生0和1之間的隨機雙,並使用範圍:

  • 介於0和0.01(1%):第1項滴劑
  • 0.01和0.0185(1%+ 0.85%):第2滴劑
  • 0.0185和0.0195(1.85%+ 0.1%)之間:項目3滴
  • ...
+0

謝謝你的僞示例,我無法把頭繞在它的周圍,直到我閱讀@ libik的答案,但現在一切都合情合理 - 謝謝。 :D – Timmy