2017-06-30 1 views
1

Comment fonctionne la distribution:Comment la distribution de Math.random() * 50 + Math.random() * 20 se compare à Math.random() * 70?

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

comparer à celui de:

var randomNumber = Math.random()*70; 
+0

Je pense que vous obtiendrez une meilleure réponse dans stat.stackexchange.com, car cela dépend uniquement des propriétés mathématiques et non d'un langage spécifique. Essayez de demander "distribution uniforme linéaire" * A + "distribution uniforme linéaire" * B = "distribution uniforme linéaire" * (A + B) – Roberto

+0

Egal. a * (b + c) = a * b + a * c après Adam Riese –

+1

@Jonasw C'est incorrect. La distribution d'une somme de variables aléatoires est la convolution de leurs fonctions de densité, donc elle est généralement différente. –

Répondre

3

Le premier ne produira pas une distribution plus plat avec des valeurs proches de 70/2, alors que le second produira une distribution uniforme ..

La façon facile de savoir est juste pour échantillonner les valeurs et les représenter graphiquement.

Échantillonné lentement juste pour le plaisir.

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

Vous pourriez faire une approche de la force brutale en comptant un million de valeurs aléatoires et vérifier si la somme r70s est égale à un valeur aléatoire unique r70.

Comme vous le voyez, la distribution n'est pas égale.

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

La fonction de densité d'une somme de variables aléatoires est la convolution des fonctions de densité des opérandes.

Dans ce cas, les deux sommets ont des densités uniformes, donc leur convolution est une fonction linéaire par morceaux (un triangle). En général, pour la somme de n variables uniformes, la densité de la somme est un polynôme parcellaire de degré n - 1.

La somme a la valeur attendue égale à la somme des valeurs attendues, à savoir 50/2 et 20/2, qui est égal à 70/2, ce qui est la valeur attendue de Math.random() * 70. Les valeurs attendues sont donc les mêmes, mais les distributions sont différentes.