Sign in to follow this  
Vizcur

weightedPick random function

Recommended Posts

I found this function really useful except for picking the last element, which is really really hard in comparison with the other elements, because only the number '1' in a random selection between  0 and 1 with double precision floating points can give the last element. Therefore, the probability of obtaining the last element is too low to be useful. 

 
var test = [0,1,2,3,4,5,6,7,8,9];for(i = 0; i< 1000000; i++){   rnd = this.game.rnd.weightedPick(test);   if(rnd == 9)       console.log(rnd);}
 
 
PS:  The way i solved this is by adding a "dummy"(or a placeholder) element in the last place of the array. So, any suggestion for a clean solution?. Thanks in advance.

Share this post


Link to post
Share on other sites

I was thinking this same thing, and problem lies in the weightedPick implementation of using ~~ for flooring the numbers. The solution would be either your dummy entry (workaround) or better would be to use rounding by adding + 0.5 to the algorithm.

 

Right now it is:

 

return ary[~~(Math.pow(this.frac(), 2) * (ary.length - 1))];

 

But this would result a bit better weighting:

 

return ary[~~(Math.pow(this.frac(), 2) * (ary.length - 1) + 0.5)];

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.