簡體   English   中英

減少從連續數字列表中選擇數字的機會

[英]Decreasing chance of choosing a number from a list of consecutive numbers

比方說,我得到了數字3 然后我必須選擇0到3之間的隨機數,但是0的選擇概率大於1,1選擇的概率大於2,而2選擇的概率大於3。

我已經知道,通過執行以下操作可以實現從0到3選擇特定數字的百分比機率:

double r = Math.random();
int n = 0;
if (r < 0.5) {
    n = 0;
    // 50% chance of being 0
} else if (r < 0.8) {
    n = 1;
    // 30% chance of being 1
} else if (r < 0.95) {
    n = 2;
    // 15% chance of being 2
} else {
    n = 3;
    // 5% chance of being 3
}

問題是3可以是任何東西。 我怎樣才能做到這一點?

注意:數字0.5,0.8和0.95由我任意選擇。 我希望這些數字減少,以便所有數字的總和等於1,並且如果在某種程度上可能的話,它們都不相同。

這似乎是您希望使用通用概率分布,其域可以根據您的喜好進行縮放。 您可以選擇任何函數,使得f(0) = 0f(1) = 1 對於這個例子,我將取f(x) = x^2

要從此處獲取隨機數 - 更多值集中在0附近 - 我們可以執行以下操作:

numbers = ceil(max * f(rand()))

其中ceil是上限函數, max是你想要的最高輸出, f()是你選擇的函數, rand()給出一個介於0和1之間的隨機數。 請注意,此功能的輸出范圍為1max而不是0max

下面的圖表可以讓您了解為什么這實際上有效:

用於<code> max == 10 </ code>的<code> ceil(f(x))</ code>圖

請注意,隨着整數變大,選擇整數的可能性越小 - 即ceil(max * f(x))等於“最長”1和“最短”10。

如果您希望選擇的數字與其大小之間存在直接關系,則只需選擇不同的f(x) 然而,在這一點上,這變成了一個數學問題而不是其他任何東西。 我會尋找一個合適的f(x) - 如果我理解你至少要找什么並回到你身邊。 我猜現在f(x)將是e^x但我會仔細檢查。

我希望這有幫助!


一個快速的代碼示例:

public int weightedRandom(int max, Random rand) {
     return Math.ceil(((double) max) * Math.pow(rand.nextDouble(), 2));
}

我還在java程序中打印了一對,並得到以下列表,其中max == 10

2.0, 6.0, 8.0, 3.0, 2.0, 2.0, 1.0, 1.0, 1.0, 1.0, 7.0, 1.0, 4.0, 1.0, 1.0, 6.0, 8.0, 9.0, 7.0, 5.0

我建議使用: java.util.Random public double nextGaussian()方法這允許在平均值附近包含更多元素的分布

我不會再解釋它是什么寫在那里Javamex nextGaussian (如果你想要更多的細節)

所以實際上你想要0n之間的值:

該方法將給出如下值:

  • 70%與1的平均偏差
  • 95%與平均值2偏差
  • 與平均值相差3次時為99%

偏差為1,沒有任何東西


 Random r = new Random();
 int n = 10;
 int res = (int) Math.min(n, Math.abs(r.nextGaussian()) * n / 3);

所以:

  • 乘以n :偏差變為n
  • 除以4:使用這樣的事實,你可以得到比偏差更大的值(在3偏差時為99%),大約99%的值將在偏差之下(你的n
  • 使用Math.abs因為它與中間的0是對稱的
  • 如果值高於n請使用Math.min作為最終檢查

測試10 000次迭代:

直方圖

您可以將函數應用於隨機數,以減少出現接近1的數字的機會。 然后乘以你的(無法到達的)最大數:在這個例子中為4

int n = 4 * (1 - Math.sqrt(Math.random()))

“均勻”可能意味着“每個連續數字減少固定數量的概率”或“每個連續數字減少固定百分比的概率”。 例如,如果您使用50%的固定百分比隨機選擇4個數字:

  • 100%的50%是50%,因此第一個數字的概率是50%。
  • 50%的50%是25%,所以第二個數字的概率是25%。
  • 25%的50%是12.5%,因此第三個數字的概率是12.5%。
  • 您需要概率加起來為100%,因此最后一個數字(#4)的概率等於倒數第二個數字(#3)的概率 - 即12.5%。

如果你想每次減少一個隨機(但正在減少)的百分比,你可以只生成一個小於前一個概率的概率的隨機數 - 即如果第一個的概率是0.5,那么概率第二個是0.0 <p <0.5。 但是,您可能希望比這更復雜一點,否則您可能會面臨最后幾個項目的微小百分比。 例如,如果你為第二項隨機選擇0.1,那么第三項的概率是0.0 <p <0.1范圍內的隨機數,這是非常小的,並且只會從那里變得更糟。 您可能希望使連續項目的概率同時具有最小值和最大值(例如,第二項的概率為0.3 <p <0.5)。

請注意,我使用<而不是<=這一事實非常重要。 例如,您不希望0.0 <= p <= 0.5,因為這意味着第二項可能與第三項(您不想要的)具有相同的概率,這也是可能的所有后續項目的概率等於0.0(即第一個數字的概率為100%,任何其他數字概率為0%,這根本不是你想要的)。

后一種策略的弱點在於你必須調整其中一個概率,使它們加起來為1.0。

暫無
暫無

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

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