Как распределение Math.random () * 50 + Math.random () * 20 сравнивается с Math.random () * 70?

1

Как распределяется:

var randomNumber = Math.random()*50 + Math.random()*20;

по сравнению с:

var randomNumber = Math.random()*70;
  • 0
    Я думаю, вы получите лучший ответ на stat.stackexchange.com, так как он зависит только от математических свойств, а не от какого-либо конкретного языка. Попробуйте задать «линейное равномерное распределение» * A + «линейное равномерное распределение» * B = «линейное равномерное распределение» * (A + B)
  • 0
    Ровный. a * (b + c) = a b + a c после Адама Риса
Показать ещё 2 комментария
Теги:
statistics
random

3 ответа

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.
2

Вы можете сделать грубую силу, r70s на миллион случайных значений и проверить, равна ли сумма 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);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1

Функция плотности суммы случайных величин представляет собой свертку функций плотности слагаемых.

В этом случае два слагаемых имеют равномерную плотность, поэтому их свертка является кусочно-линейной функцией (треугольником). В общем случае для суммы п равномерных переменных плотность суммы является кусочным многочленом степени n - 1.

Сумма имеет ожидаемое значение, равное сумме ожидаемых значений, а именно 50/2 и 20/2, что равно 70/2, что является ожидаемым значением Math.random() * 70. Таким образом, ожидаемые значения одинаковы, но распределения различны.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню