Vizcur Posted January 27, 2015 Share Posted January 27, 2015 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. Link to comment Share on other sites More sharing options...
jouniii Posted January 28, 2015 Share Posted January 28, 2015 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)]; Tilde and Vizcur 2 Link to comment Share on other sites More sharing options...
gingerbeardman Posted April 17, 2015 Share Posted April 17, 2015 I've also been disappointed with the results of weightedPick. @jounii: I've just issued a pull request with your code suggestion, I hope that's OK? https://github.com/photonstorm/phaser/pull/1751 Tilde 1 Link to comment Share on other sites More sharing options...
Recommended Posts