0

我想用自定义宽度随机化我的列表。为此,我编写了简单的 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。现在它 - 显然 - 随机的,所以有时我会得到 all 2,其他时候 - all 1。我如何添加比例(比如说 3:1)?

4

2 回答 2

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;
于 2013-09-28T17:52:18.173 回答
0

我正在使用的另一种方式可以为您服务:

// 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);
<ul id="rand-value"></ul>

虽然只有 2 个值可能有很多代码,但我发现它更具可读性和更易于维护。(当你有更多值时,这很棒!!!)

希望这对某人有用!:)

于 2017-07-25T19:36:27.200 回答