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,并且如果在某种程度上可能的话,它们都不相同.
这似乎是您希望使用通用概率分布,其域可以根据您的喜好进行缩放.你可以选择这样的任何功能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.
下面的图表可以让您了解为什么这实际上有效:
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)