我正在尝试生成1和最大值之间的随机数。这个我没有问题,这样做并用以下操作:在权重/偏差范围内生成一个随机数?
var max = 200;
var randomNumber = Math.floor(Math.random() * max) + 1;
然而,在理想的情况下,我想1和我的最大值之间产生了一些,不过较低的数字有较高的概率发生。我希望变量偏向1,但是我的数学技能还不够强大,如果有人能指出我正确的方向,那将是非常好的。
谢谢
乔希
我正在尝试生成1和最大值之间的随机数。这个我没有问题,这样做并用以下操作:在权重/偏差范围内生成一个随机数?
var max = 200;
var randomNumber = Math.floor(Math.random() * max) + 1;
然而,在理想的情况下,我想1和我的最大值之间产生了一些,不过较低的数字有较高的概率发生。我希望变量偏向1,但是我的数学技能还不够强大,如果有人能指出我正确的方向,那将是非常好的。
谢谢
乔希
一个简单的方法将是刚方的Math.random的结果()。由于函数的结果在0和1之间,所以正方形也将在[0,1]的范围内,但是例如0.5的值将映射到较低的值--0.25。您可以尝试1以上的功率,直到找到可接受的功能。
我得到了一个java代码,它可以做你想做的事情。 你应该为int [] prob数组选择你自己的概率。 我认为它不会很难将其翻译为js或构建水平。等于。
int[] probs;
void initRandom(int n, int[] probabilities)
{
int i,j,begin=0,end=0,sum=0;
int[] probs;
// sum of all propabilitys must be 100%
for(i=0;i<probabilities.length;i++) sum+=probabilities[i];
probs=new int[sum];
// fills numbers from 0 till n-1 in regard to their probabilities
// to the probability array.
for(i=0;i<n;i++)
{
begin=end;
end+=probabilities[i];
for(j=begin;j<end;j++) probs[j]=i;
}
}
int genRandom()
{
return probs[smallRand(probs.length-1)];
}
这是一个非常普遍的问题。首先考虑这个链接这里 http://en.wikipedia.org/wiki/List_of_probability_distributions#Supported_on_a_bounded_interval 它显示了一些概率函数是有界的,我相信你正在寻找(自min = 1和max = max)。 您也可以选择一个半无限区间,并忽略超过最大值的所有值。我认为,这也可以接受,取决于您的应用程序。
接下来,选择一个最适合您的概率函数。为了简单起见,我通过反转CDF选择了三角分布
的分布函数是(PDF和CDF)
f(x) = 2/(2*max-1-max^2)*(x-max)
F(x) = 2/(2*max-1-max^2)*(0.5*x^2-max*x-0.5+max)
,以便可以通过一个均匀分布生成0-1偏压分布像
var urand = Math.random();
var a = 2/(2*max-1-max^2);
var randomNumber = max-Math.sqrt(max*max-2*(max-urand/a-0.5));
干杯 [R
以下功能我做了让你接近一个偏置随机NU mber
function rand(max) {
var r = Math.random();
r = 1/(101-100 * r);
return Math.floor(r * max) - 1;
}
它只使用简单的算术运算,因此它应该相当快。