javascript - 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; ">
解决方案
您可以为每个可能的选项分配权重。
然后,您可以在权重总和上生成一个随机数,并查看随机命中的位置:
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();
推荐阅读
- sql - 更新具有串行主键的表和具有引用外键(postgres)的另一个表
- javascript - 如何在 wordpress 中从 ajax 调用 php 函数?
- pytorch - 使用 Pytorch 运行 Bert 时 CUDA 内存不足(以前工作过)
- javascript - 如何将所有键/值对从 forEach 推送到对象
- php - 如何拥有多个依赖用户输入的产品 Laravel
- android - Android:尽管有权限,但无法列出 /storage/emulated/0 文件
- python - 当我装饰 python 函数时,VS Code 在悬停时显示包装器的帮助,而不是函数的
- string - 如何在 Bash 中比较和递归修改字符串
- spring-boot - Spring boot 数据 Cassandra 抛出 com.datastax.oss.driver.api.core.DriverTimeoutException: query 'SELECT * FROM system.peers' 在 PT0.5S 后超时
- csv - 有没有一种简单的方法来拆分具有多行条目的大型 CSV 文件?