Hmm, working on your original, I had a fairly simple algorithm to create ranges in an array in the appropriate proportion, then randomly select a range and generate a random number in that range. Without a doubt, if necessary, it can be optimized, but it works for me.
It looks like a lot of code, but 3/4 of its comments, test data and functions, the actual randomRange function is only 17 lines of code.
<script type="text/javascript"> function randomRange(dataArray) { // Helper function function getRandomInRange(s, f) { return (Math.random() * (f-s+1) | 0) + s } // Generate new data array based on probability var i, j = dataArray.length; var oArray = []; var o; while (j--) { o = dataArray[j]; // Make sure probability is an integer for (i=0, iLen=o.probability|0; i<iLen; i++) { oArray.push([o.rangeStart, o.rangeEnd]); } } // Randomly select a range from new data array and // generate a random number in that range var oEnd = oArray.length; var range = oArray[getRandomInRange(0, oArray.length - 1)]; return getRandomInRange(range[0], range[1]); } // Test data set. Probability just has to be // representative, so 50/50 === 1/1 var dataArray = [ { rangeStart: 0, rangeEnd : 20, probability: 1 }, { rangeStart: 21, rangeEnd : 400, probability: 1 } ]; // Test function to show range and number is randomly // selected for given probability function testIt() { var el0 = document.getElementById('div0'); var el1 = document.getElementById('div1'); function run() { var n = randomRange(dataArray); if (n <= 20) { el0.innerHTML += '*'; } else { el1.innerHTML += '*'; } } setInterval(run, 500); } </script> <button onclick="testIt();">Generate random number</button> <div>Numbers 0 - 20</div> <div id="div0"></div> <div>Numbers 21 - 400</div> <div id="div1"></div>
source share