随机数与比率

时间:2013-09-28 17:48:42

标签: javascript

我想用自定义宽度随机化我的列表。为此,我编写了简单的JavaScript代码段,在1 and 2之间生成数字。

功能如下:

randomizePortfolio: function() {
    $('ul.works').children('li').each(function() {
        var Random = Math.floor(Math.random() * 2) + 1,
            words = 'normal';
        if(Random == '2') {
            words = 'wide';
        }

        $(this).addClass('col-md-'+3*Random+' col-sm-'+3*Random+' '+words);
    });

    $('ul.works').masonry({
        itemSelector: 'li'
    });
}

问题是,我希望1的比例更高。现在它 - 显而易见 - 随机,所以有时我得到所有2,其他时间 - 所有1。如何为此添加比率(比方说3:1)?

2 个答案:

答案 0 :(得分:3)

要获得3:1分布,您可以创建一个包含所需数字的数组,并添加三个1和一个2,并随机化索引:

var rvalues = [1,1,1,2];
var Random = rvalues[Math.floor(Math.random() * rvalues.length)];

这是另一种等效的方法,基于3/4的随机值小于3/4的事实:

var Random:
if (Math.random() < .75) Random = 1;
else Random = 2;

答案 1 :(得分:0)

另一种方式,我正在使用,可以为你做到:

&#13;
&#13;
// here's the value we wanna get by ratio (where v is value and r is ratio)
// r is an array with min and max value, this example is based on a 100% ratio
const ratioValues = [
  {v: 1, r: [0,75]}, // 75% chance to get 1
  {v: 2, r: [76,100]} // 25% chance to get 2
];
//actual function to get our value
function getRandByRatio(ratioValues) {
  // idx is a random integer between 0 and 100
  let idx = Math.floor(Math.random() * (100 + 1));
  for (let item of ratioValues) {
    // test if idx is within the r range
    if (idx >= item.r[0] && idx <= item.r[1]) {
      //if it is return our value
      return item.v;
    }
  }
};

// let's make a testing function
function makeTest(nb) {
  const ul = document.getElementById("rand-value");
  for (let i = 0; i < nb; i++) {
    ul.innerHTML += "<li>" + getRandByRatio(ratioValues) + "</li>";
  }
};

makeTest(10);
&#13;
<ul id="rand-value"></ul>
&#13;
&#13;
&#13;

虽然只有2个值的代码可能相当多,但我觉得它更易读,更容易维护。(当你有更多的价值时,它会很棒!!!)

希望这对某人有用!! :)