在 weight/bias 范围内生成随机数?
Generating a random number between a range with a weight/bias?
我正在尝试生成一个介于 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[] 概率数组选择自己的概率。
我认为将其翻译成 js 或构建 smth 并不难。等于。
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)];
}
这是一个非常笼统的问题。首先在这里考虑这个 link
http://en.wikipedia.org/wiki/List_of_probability_distributions#Supported_on_a_bounded_interval
它显示了一些有界的概率函数,我相信这就是您正在寻找的(因为 min=1 和 max=max)。
您还可以选择半无限间隔,并忽略所有高于最大值的值。我认为,这也可以接受,具体取决于您的应用程序。
接下来,选择一个最适合您的概率函数。为了简单起见,我选择了三角分布
分布函数为(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)
所以我可以通过像
那样反转 CDF,从 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
我编写的以下函数为您提供了一个接近偏一的随机数
function rand(max) {
var r = Math.random();
r = 1/(101-100 * r);
return Math.floor(r * max) - 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[] 概率数组选择自己的概率。 我认为将其翻译成 js 或构建 smth 并不难。等于。
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)];
}
这是一个非常笼统的问题。首先在这里考虑这个 link http://en.wikipedia.org/wiki/List_of_probability_distributions#Supported_on_a_bounded_interval 它显示了一些有界的概率函数,我相信这就是您正在寻找的(因为 min=1 和 max=max)。 您还可以选择半无限间隔,并忽略所有高于最大值的值。我认为,这也可以接受,具体取决于您的应用程序。
接下来,选择一个最适合您的概率函数。为了简单起见,我选择了三角分布
分布函数为(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)
所以我可以通过像
那样反转 CDF,从 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
我编写的以下函数为您提供了一个接近偏一的随机数
function rand(max) {
var r = Math.random();
r = 1/(101-100 * r);
return Math.floor(r * max) - 1;
}
它只使用简单的算法,因此应该很快。