JavaScript的Math.random()
返回与“均匀”分布的伪随机数。
我需要生成在歪斜给任一侧上的范围[0,1]的随机数。 (意思是,越来越旁边的数字0或旁边1的机会较高)
理想情况下,我想有一个参数来设置这条曲线。
我认为我可以做Math.random^2
得到这样的结果,但什么更复杂的方式是有实现这一目标?
JavaScript的Math.random()
返回与“均匀”分布的伪随机数。
我需要生成在歪斜给任一侧上的范围[0,1]的随机数。 (意思是,越来越旁边的数字0或旁边1的机会较高)
理想情况下,我想有一个参数来设置这条曲线。
我认为我可以做Math.random^2
得到这样的结果,但什么更复杂的方式是有实现这一目标?
我想你想用β分布alpha=beta=0.5
这是可能使用反向累积分布变换均匀随机数到β分布。
unif = Math.random()
我不熟悉javascript
,但是这应该是清楚的:
beta = sin(unif*pi/2)^2
PS:您可以生成许多这样的数字和情节直方图
编辑:
用于朝向0歪斜,变换beta
值作为-
beta_left = (beta < 0.5) ? 2*beta : 2*(1-beta);
对于向1倾斜,转化为 -
beta_right = (beta > 0.5) ? 2*beta-1 : 2*(1-beta)-1;
我认为你需要重新考虑你的问题。 泊松处于率,来指定计数分布如的东西多少次我看到每个时间段的平均水平。 它产生正整数所以只是在范围[0,1]的结果是不可能的。 可以请你澄清你想要什么?
无论如何,以产生与泊松率拉姆达一种算法是:
threshold = Math.exp(-lambda)
count = 0
product = 1.0
while (product *= rand) >= threshold {
count += 1
}
return count
其中“兰特”是函数调用的统一(0,1)。 我不知道的JavaScript,但应该是简单的够你实现。
在回答编辑的问题:
有迹象表明,产生于在有限范围的效果的多个分布,但其中许多人是不适合心脏虚弱,如生家族或Beta分布。
容易的是三角形分布。 SQRT(RAND)会给朝向1聚束的三角形分布,而(1-SQRT(1-RAND))会给接近零成束的三角形分布。
与在m的模式(最频值)的更一般的三角形(其中0 <= M <= 1)可与所生成的
if rand <= m
return m * Sqrt(rand)
else
return 1 - ((1 - m) * Sqrt(1 - rand))
需要注意的是兰德的每次调用是一个独立的均匀随机数,这不会,如果你生成一个兰特价值和整个使用它是正确的。
我只是想出了一个更简单的方式来获得倾斜每一方的随机数,并没有任何相关性。
此方法使用两个JavaScript的常规的随机数。 第一乘以本身(指数越大,越大偏斜效应),而第二选其中分布的侧歪斜到。
function skewedRandom() {
const a = Math.pow(Math.random(), 2);
if (Math.random() < 0.5) {
return a;
}
return 1 - a;
}
在这种代码的指数被设置为2的样品直方图10000个执行与在2如上指数:
随着指数3:
而随着指数的10:
同比可以使用window.crypto.getRandomValues如果可用
<div id="result"></div>
var randVal = new Uint8Array(1);
window.crypto.getRandomValues(randVal);
document.getElementById("result").textContent = randVal[0] / 255;
上的jsfiddle
(如果这是你问什么,我不知道)
或者,也许因为这
<div id="result"></div>
function poissonRandomNumber(lambda) {
var L = Math.exp(-lambda),
k = 0,
p = 1;
do {
k = k + 1;
p = p * Math.random();
} while (p > L);
return k - 1;
}
document.getElementById("result").textContent = poissonRandomNumber(100);
还上的jsfiddle