jeudi 9 mai 2019

Picking Array Values using Probability

I have a homework to do, that is:

Pick a random color, from yellow, blue and red, given the probability of: Yellow: 3/7 Blue: 1/7 Red: 3/7


I know that I could work this around by using something like: [yellow, yellow, yellow, blue, red, red, red] But I don't think this would be programatically good, since when I chance the probability, I would have to change the array.

So, I thought I could try something like a weight approach

let yellow_probability = 3/7
let blue_probability = 1/7
let red_probability = 3/7

const colors = ['yellow', 'blue', 'red']

function pickPosition(yellow_probability, blue_probability, red_probability){

    let yellow_weight = Math.random() * yellow_probability
    let blue_weight = Math.random() * blue_probability
    let red_weight = Math.random() * red_probability

    let weights = [yellow_weight, blue_weight, red_weight]

    let max_of_array = Math.max.apply(Math, weights);

    pickedColor = weights.indexOf(max_of_array)

    return pickedColor

}
pickedColorIndex = pickPosition(yellow_probability, blue_probability, red_probability)
pickedColor = colors[pickedColorIndex]
console.log(pickedColor)


I did a test:

let n=1000000; 
let yellow=0, blue=0, red=0; 
for (let i=0; i<n; i++) {

    pickedColorIndex = pickPosition(yellow_probability, blue_probability, red_probability)
    if (pickedColorIndex==0) yellow++
    else if (pickedColorIndex==1) blue++
    else red++;
}
console.log("yellow = " + yellow/n );
console.log("blue = " + blue/n );
console.log("red = " + red/n );

And I would expect this test to output something like:

Yellow = 0.43
Blue = 0.14
Red = 0.43

But I am getting:

Yellow = 0.48
Blue = 0.03
Red = 0.48

It is interesting to point out that the code works when the probabilities are equal (1/3, 1/3, 1/3) or something like (1/2, 1/2, 0)

Can anyone point out what I am doing wrong?




Aucun commentaire:

Enregistrer un commentaire