减少从连续数字列表中选择数字的机会

Jac*_*ais 5 java random percentage

比方说,我得到了号码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
}
Run Code Online (Sandbox Code Playgroud)

问题在于它3可以是任何东西.我怎样才能做到这一点?

注意:数字0.5,0.8和0.95由我任意选择.我希望这些数字减少,以便所有数字的总和等于1,并且如果在某种程度上可能的话,它们都不相同.

k.k*_*.27 6

这似乎是您希望使用通用概率分布,其域可以根据您的喜好进行缩放.你可以选择这样的任何功能f(0) = 0f(1) = 1.对于这个例子,我将采取f(x) = x^2.

要从此处获取随机数 - 更多值集中在0附近 - 我们可以执行以下操作:

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

ceil天花板功能在哪里,max是你想要的最高输出,f()是你选择的功能,并rand()给出一个介于0和1之间的随机数.请注意,这个函数的输出会在一个范围内1,以max0max.

下面的图表可以让您了解为什么这实际上有效:

用于<code>f(x)</code>.然而,在这一点上,这变成了一个数学问题而不是其他任何东西.我会寻找一个合适的<code>f(x)</code>- 如果我明白你在寻找什么,并回复你.我猜到现在<code>f(x)</code>将是,<code>e^x</code>但我会仔细检查.</p>

<p>我希望这有帮助!</p>

<hr>

<p>一个快速的代码示例:</p>

<pre><code>public int weightedRandom(int max, Random rand) {
     return Math.ceil(((double) max) * Math.pow(rand.nextDouble(), 2));
}
</code></pre><a target=Run Code Online (Sandbox Code Playgroud)

我还在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
Run Code Online (Sandbox Code Playgroud)