如何分发:
var randomNumber = Math.random()*50 + Math.random()*20;
与以下相比:
var randomNumber = Math.random()*70;
答案 0 :(得分:3)
第一个不会产生平坦分布,其值越接近70/2,而第二个将产生均匀分布。
找出答案的简单方法就是对值进行采样并绘制图形。
慢慢采样只是为了好玩。
const ctx = canvas.getContext("2d");
const a1 = new Float64Array(70);
const a2 = new Float64Array(70);
var total = 0;
function doSamples(samples){
for(var i = 0; i < samples; i ++){
var n1 = Math.random() * 50 + Math.random() * 20;
var n2 = Math.random() * 70;
a1[n1 | 0] += 1;
a2[n2 | 0] += 1;
}
var max = 0;
for(i = 0; i < 70; i ++){
max = Math.max(max,a1[i],a2[i]);
}
ctx.clearRect(0,0,canvas.width,canvas.height);
for(i = 0; i < 70; i ++){
var l1 = (a1[i] / max) * canvas.height;
var l2 = (a2[i] / max) * canvas.height;
ctx.fillStyle = "Blue";
ctx.fillRect(i * 8,canvas.height - l1,4,l1)
ctx.fillStyle = "Orange";
ctx.fillRect(i * 8 + 4,canvas.height - l2,4,l2)
}
total += samples;
count.textContent = total;
}
function doit(){
doSamples(500);
setTimeout(doit,100);
}
doit();
canvas {border:2px solid black;}
<canvas id="canvas" width = 560 height = 200></canvas><br>
Orange is random() * 70<br>
Blue is random() * 50 + random() * 20<br>
Graph is normalised.
<span id="count"></span> samples.
答案 1 :(得分:2)
您可以通过计算一百万个随机值来执行暴力方法,并检查总和r70s
是否等于单个随机值r70
。
如您所见,分布不相等。
function countValue(key, value) {
value = Math.floor(value);
count[key][value] = (count[key][value] || 0) + 1;
}
var i,
r20, r50, r70,
count = { r20: [], r50: [], r70: [], r70s: [] };
for (i = 0; i < 1e6; i++) {
r20 = Math.random() * 20;
r50 = Math.random() * 50;
r70 = Math.random() * 70;
countValue('r20', r20);
countValue('r50', r50);
countValue('r70', r70);
countValue('r70s', r20 + r50);
}
console.log(count);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
答案 2 :(得分:1)
随机变量之和的密度函数是求和的密度函数的卷积。
在这种情况下,两个加数具有均匀的密度,因此它们的卷积是分段线性函数(三角形)。一般来说,对于n个均匀变量之和,和的密度是n-1度的分段多项式。
总和的预期值等于预期值之和,即50/2和20/2,等于70/2,这是Math.random()* 70的预期值。所以预期值是相同的,但分布是不同的。