是否有可能得到一个1-100之间的随机数,并将结果主要保持在40-60的范围内?我的意思是,它很少会超出这个范围,但我希望它主要在这个范围内……这是可能的JavaScript/jQuery?
现在我只使用基本的Math.random() * 100 + 1。
是否有可能得到一个1-100之间的随机数,并将结果主要保持在40-60的范围内?我的意思是,它很少会超出这个范围,但我希望它主要在这个范围内……这是可能的JavaScript/jQuery?
现在我只使用基本的Math.random() * 100 + 1。
当前回答
我可能会做一些事情,比如设置一个“机会”,让数字被允许“出界”。在这个例子中,数字为1-100的概率为20%,否则为40-60:
$(function () { $('button').click(function () { var outOfBoundsChance = .2; var num = 0; if (Math.random() <= outOfBoundsChance) { num = getRandomInt(1, 100); } else { num = getRandomInt(40, 60); } $('#out').text(num); }); function getRandomInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } }); <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <button>Generate</button> <div id="out"></div>
小提琴:http://jsfiddle.net/kbv39s9w/
其他回答
几年前,我需要解决这个问题,我的解决方案比其他任何答案都要简单。
我在边界之间随机生成3个,然后取平均值。这将结果拉向中心,但完全有可能到达边缘。
用这样的东西怎么样:
var loops = 10; var tries = 10; var div = $("#results").html(random()); function random() { var values = ""; for(var i=0; i < loops; i++) { var numTries = tries; do { var num = Math.floor((Math.random() * 100) + 1); numTries--; } while((num < 40 || num >60) && numTries > 1) values += num + "<br/>"; } return values; } <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <div id="results"></div>
我的编码方式允许你设置几个变量: 循环=结果的数量 Tries =函数在停止while循环之前尝试获得40-60之间的数字的次数
额外的好处:它使用do while!!这是最棒的
分布
5% for [ 0,39]
90% for [40,59]
5% for [60,99]
解决方案
var f = Math.random();
if (f < 0.05) return random(0,39);
else if (f < 0.95) return random(40,59);
else return random(60,99);
通用解决方案
random_choose([series(0,39),series(40,59),series(60,99)],[0.05,0.90,0.05]);
function random_choose (collections,probabilities)
{
var acc = 0.00;
var r1 = Math.random();
var r2 = Math.random();
for (var i = 0; i < probabilities.length; i++)
{
acc += probabilities[i];
if (r1 < acc)
return collections[i][Math.floor(r2*collections[i].length)];
}
return (-1);
}
function series(min,max)
{
var i = min; var s = [];
while (s[s.length-1] < max) s[s.length]=i++;
return s;
}
你可以使用一个辅助随机数来决定是否生成40-60或1-100的随机数:
// 90%的随机数应该在40到60之间。 Var weight_percentage = 90; var focuse_on_center = ((Math.random() * 100) < weight_percentage); 如果(focuse_on_center) { //生成40-60范围内的随机数。 alert (40 + Math.random() * 20 + 1); } 其他的 { //生成1-100范围内的随机数。 alert (Math.random() * 100 + 1); }
针对这个问题的最佳解决方案是BlueRaja - Danny Pflughoeft提出的解决方案,但我认为一个更快、更通用的解决方案也值得一提。
当我必须生成随机数(字符串,坐标对等)时,满足的两个要求
结果集非常小。(不大于16K) 结果集是离散的。(只像整数)
我通常首先创建一个数字数组(字符串,坐标对等)来满足需求(在您的情况下:一个包含多次更可能的数字的数字数组),然后从该数组中随机选择一个项目。这样,每个项目只需要调用一次昂贵的随机函数。