![](/img/trans.png)
[英]Java program to group consecutive number from given numbers in a list<list>
[英]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) = 0
和f(1) = 1
。 對於這個例子,我將取f(x) = x^2
。
要從此處獲取隨機數 - 更多值集中在0附近 - 我們可以執行以下操作:
numbers = ceil(max * f(rand()))
其中ceil
是上限函數, max
是你想要的最高輸出, f()
是你選擇的函數, rand()
給出一個介於0和1之間的隨機數。 請注意,此功能的輸出范圍為1
到max
而不是0
到max
。
下面的圖表可以讓您了解為什么這實際上有效:
請注意,隨着整數變大,選擇整數的可能性越小 - 即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 (如果你想要更多的細節)
所以實際上你想要0
到n
之間的值:
該方法將給出如下值:
偏差為1,沒有任何東西
Random r = new Random();
int n = 10;
int res = (int) Math.min(n, Math.abs(r.nextGaussian()) * n / 3);
所以:
n
:偏差變為n
n
) Math.abs
因為它與中間的0是對稱的 n
請使用Math.min
作為最終檢查 測試10 000次迭代:
您可以將函數應用於隨機數,以減少出現接近1的數字的機會。 然后乘以你的(無法到達的)最大數:在這個例子中為4
int n = 4 * (1 - Math.sqrt(Math.random()))
“均勻”可能意味着“每個連續數字減少固定數量的概率”或“每個連續數字減少固定百分比的概率”。 例如,如果您使用50%的固定百分比隨機選擇4個數字:
如果你想每次減少一個隨機(但正在減少)的百分比,你可以只生成一個小於前一個概率的概率的隨機數 - 即如果第一個的概率是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.