我正在尝试创建一个具有以下签名的函数:
function weightedRandom (target, probability) {
// calculate weighted random number that is more likely to be near target value
return value; // number from 0 to 1
}
它应做到以下几点:
例如,WeightedRandom(0.8,0.2)
将产生一个随机值,该值有20%可能聚集在值0.8周围,但可以是从0到1的任意数字。如果概率是0.5,那么更多的结果返回的随机值将接近0.8。我想也许需要另一个参数来定义集群的宽度(标准差?)。
TLDR:在两个更容易的分布中随机选择,也是逆变换抽样
如果您有一个平坦的分布,您可以平等地选择您的范围内的任何值。如果你有一个高斯分布,你可以选择一个接近你的高斯平均值的值。因此,考虑随机选择其中一个或另一个。
如果您希望随机值靠近目标t
80%的时间,其他位置为20%。假设'near'意味着在2个标准差内,我们将方差取为v
。因此,(T-2*V)
到(T+2*V)
的范围需要覆盖P(0.8)。
0.8 = 0.9545*X + (1-X)(4v/r).
0.6 = 0.6827*X + (1-X)(2v/r).
(0.8 - 0.9545*X)/(1-X)*2 = (2v/r)
(0.6 - 0.6826*x)/(1-X) = (2v/r)
等价化简
X = 0.81546
因此:
var range = [0, 10];
var target = 7.0;
var stddev = 1.0;
var takeGauss = (Math.random() < 0.81546);
if(takeGauss) {
// perform gaussian sampling (normRand has mean 0), resample if outside range
while(1) {
var sample = ((normRand()*stddev) + target);
if(sample >= range[0] && sample <= range[1]) {
return sample;
}
}
} else {
// perform flat sampling
return range[0]+(Math.random()*(range[1]-range[0]));
}
我想这给了你所需的形状,让你选择两个接近和非常接近的概率,但避免了太多的复杂性。
function normRand() {
var x1, x2, rad;
do {
x1 = 2 * Math.random() - 1;
x2 = 2 * Math.random() - 1;
rad = x1 * x1 + x2 * x2;
} while(rad >= 1 || rad == 0);
var c = Math.sqrt(-2 * Math.log(rad) / rad);
return x1 * c;
};
然后,游戏是构造一个你满意的分布,并将其反向以得到逆变换,要么使用上面的片段,要么通过解析反向,或者一些近似(高斯逆不能解析地写下来)。这样,您就可以将任何平面分布的样本转换为所需的分布。
从上面的步长分布中采样如下所示:
// transform 0-1 flat to 0-10 stepped
function stepInvTransform(z) {
return (3*z < 1 ? 9*z : (12*z - 1));
}
// sample via inv transform
var sample = stepInvTransform(Math.random());
问题内容: 我想知道在特定范围内生成随机数的最佳方法(例如在Java中)是什么,而每个范围内的每个数字都有一定的发生概率? 例如 从[1; 3]内产生随机整数,并具有以下概率: P(1)= 0.2 P(2)= 0.3 P(3)= 0.5 现在,我正在考虑在[0; 100]内生成随机整数并执行以下操作的方法: 如果它在[0; 20]之内->我得到我的随机数1。 如果它在[21; 50]之内->我得到
我想知道(例如在Java中)在特定范围内生成随机数的最佳方法是什么,其中每个数都有一定的发生概率? e. g. 从[1;3]中生成概率如下的随机整数: P(1)=0.2 P(2)=0.3 P(3)=0.5 现在,我正在考虑在[0;100]范围内生成一个随机整数的方法,并执行以下操作: 如果在[0; 20]以内--
假设我得到的是范围内的随机数,使用: 假设它给出的数字小于或等于25,你就赢了,如果它给出的数字大于25,我就赢了。然后我有75%的机会赢。 我该如何加权这个数字大于25的概率的某个百分比,比如说1%。 所以,基本上,我试图将我获胜的几率再提高1%,而不是仅仅说“你赢24分或更少” 如果不清楚,请告诉我。
我们了解了“样本空间”,“事件”,“概率”。样本空间中包含了一次实验所有可能的结果,事件是样本空间的一个子集,每个事件可以有一个发生的概率。概率是集合的一个“测度”。 这一讲,我们将讨论随机变量。随机变量(random variable)的本质是一个函数,是从样本空间的子集到实数的映射,将事件转换成一个数值。根据样本空间中的元素不同(即不同的实验结果),随机变量的值也将随机产生。可以说,随机变量是
随机变量的函数 在前面的文章中,我先将概率值分配给各个事件,得到事件的概率分布。 通过事件与随机变量的映射,让事件“数值化”,事件的概率值转移到随机变量上,获得随机变量的概率分布。 我们使用随机变量的函数,来定制新的随机变量。随机变量的函数是从旧有的随机变量到一个新随机变量的映射。通过函数的映射功能,原有随机变量对应新的随机变量。通过原有随机变量的概率分布,我们可以获知新随机变量的概率分布。事件,
主要内容:实例,实例,概率分布,实例,实例,实例,实例,实例,实例,实例,数据分析,实例,实例,实例随机数 Verilog 中使用系统任务 $random(seed) 产生随机数,seed 为随机数种子。 seed 值不同,产生的随机数也不同。如果 seed 相同,产生的随机数也是一样的。 可以为 seed 赋初值,也可以忽略 seed 选项,seed 默认初始值为 0。 不使用 seed 选项和指定 seed 并对其修改来调用 $random 的代码如下所示: 实例 //seed va