我正在寻找实现随机数生成器的最佳方法,这将使我能够控制生成的数字将返回的范围.为了形象化我要实现的目标,我有一幅画:
I'm looking for the best way of implementing random number generator, that will allow me to have control over probability from what range the generated number will be returned. To visualize what I'm trying to achieve I have a picture :
所以总结一下: 假设我的范围是400.一开始,我希望有5%的概率获得数字0-20.但是在某个时候,我希望这个可能性增加到50%.希望你能明白.
So to summarize : Let's say that my range is 400. At the beginning I'd like to have 5% probability of getting number 0-20. But at some moment in time I'd like to have this probability increased up to 50%. Hope you get the idea.
推荐答案嗯,在您的原始图片上,我有一个非常简单的算法,可以按适当的比例在数组中生成范围,然后随机选择一个范围并生成一个随机数在该范围内.毫无疑问,如果有必要可以对其进行优化,但是它对我有用.
Hmm, working on your original I had a pretty simple algorithm to generate ranges in an array in the appropriate proportion, then randomly select a range and generate a random number within that range. No doubt it can be optimised if necessary, but it works for me.
看起来很多代码,但其中的3/4是注释,测试数据和函数,实际的 randomRange 函数只有17行代码.
It looks like a lot of code, but 3/4 of it is comments, test data and function, 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>更多推荐
随机数范围的不同概率
发布评论