首页 > 解决方案 > Javascript随机网址重定向具有不同的几率

问题描述

我有以下代码在页面加载时根据随机数(根据提供的链接数)重定向到不同的 url。它工作正常。

我想要做的是控制每个链接被加载的几率。

更准确地说,我只希望第一个链接“获胜”的机会最低。

var links = [
  "flip1.html",
  "flip2.html",
  "flip3.html",
  "flip4.html",
  "flip5.html"
]
var openSite = function() {
  // get a random number between 0 and the number of links
  var randIdx = Math.random() * links.length;
  // round it, so it can be used as array index
  randIdx = parseInt(randIdx, 10);
  // construct the link to be opened
  var link = 'http://' + links[randIdx];

  var win = window.open(link, '_self');
  win.focus();

};
<body onload="javascript:openSite();" style="height: 100%; margin: 0px; padding:0px; ">

标签: javascript

解决方案


您可以为每个可能的选项分配权重。

然后,您可以在权重总和上生成一个随机数,并查看随机命中的位置:

var links = [
  { url: "flip1.html", weight: 1 }, // 5%
  { url: "flip2.html", weight: 2 }, // 10%
  { url: "flip3.html", weight: 3 }, // 15%
  { url: "flip4.html", weight: 4 }, // 20%
  { url: "flip5.html", weight: 10 } // 50%
];

function weightedRandom(arr)
{
  var weightSum = arr.map(l => l.weight).reduce((a, b) => a + b, 0);
  var rand = Math.random() * weightSum;
  
  var accumulated = 0;
  for (var i = 0; i < arr.length; i++)
  {
    if (rand < accumulated + arr[i].weight)
    {
      return arr[i];
    }
    
    accumulated += arr[i].weight;
  }
}

function openSite() {
  var link = weightedRandom(links);
  
  // uncomment this and call openSite function:
  //var win = window.open(link.url, '_self');
  //win.focus();
}

function experiment()
{
  var testsCount = 10000;
  var counts = {};
  
  for (var i = 0; i < links.length; i++)
  {
    counts[links[i].url] = 0;
  }
  
  for (var i = 0; i < testsCount; i++)
  {
    var link = weightedRandom(links);
    counts[link.url]++;
  }
  
  console.log(counts);
}

experiment();


推荐阅读