Javascript中的加权随机数生成
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Javascript中的加权随机数生成,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2461字,纯文字阅读大概需要4分钟。
内容图文
![Javascript中的加权随机数生成](/upload/InfoBanner/zyjiaocheng/785/b20edd2cd457438fb6a8e196bf937a37.jpg)
我有一个看起来像这样的数组:
[
{
plays: 0,
otherData: someValues
}, {
plays: 4,
otherData: someValues
}, {
plays: 1,
otherData: someValues
}, {
plays: 2,
otherData: someValues
} {
plays: 9,
otherData: someValues
}, {
plays: 7,
otherData: someValues
}, {
plays: 5,
otherData: someValues
}, {
plays: 0,
otherData: someValues
}, {
plays: 8,
otherData: someValues
}
]
它是关于播放列表中歌曲的一系列信息,其中播放是歌曲播放的次数.我试图想出一个加权随机数生成器,它将选择一个元素的索引,加权使得较少播放的歌曲更有可能被选中.这是我现在的代码:
function pickRandom(){
var oldIndex = index;
if(songs.length <= 1)
return index = 0;
var unheard = [];
for(i in songs){
if(!songs[i].plays)
unheard.push(i);
}if(unheard.length > 0)
return index = unheard[Math.round(Math.random() * (unheard.length - 1))];
var tries = 0;
while(index == oldIndex && tries < 100){
index = Math.round(Math.random() * (songs.length - 1));
tries++;
}return index;
}
这个解决方案有很多东西让我不满意.首先,它没有加权,因为它真的只是选择一首未播放的歌曲,或任何旧的随机曲目,如果阵列中的所有内容至少播放过一次.其次,它创建了一个新阵列,由于播放列表有时会有数百首歌曲,所以我希望尽可能避开这些歌曲.
我能够提出的最接近的解决方案是根据其播放值将每个元素多次复制到一个新数组中,然后从中选择一个元素,但这会加剧创建新数组的问题,因为那个数组可以很容易地达到数千个元素.我非常感谢任何帮助或建议;甚至伪代码也没关系.
解决方法:
我会做你想做的循环.总计列表中任何歌曲的最大播放次数,然后通过计算反向加权的数字并从反向总计中选择来反转概率.像这样的东西:
function pickRandom(myArray) {
var maxPlays = 0, reverseTotPlays = 0, ipl, picked, revAcc = 0;
// Empty array or bad input param
if (!myArray || !myArray.length) {
return -1;
}
// Calculate the max plays for any song in the list
for (ipl = 0; ipl < myArray.length; ++ipl) {
if (myArray[ipl].plays > maxPlays) {
maxPlays = myArray[ipl].plays;
}
}
maxPlays += 1; // Avoid excluding max songs
// Calculate the reverse weighted total plays
for (ipl = 0; ipl < myArray.length; ++ipl) {
reverseTotPlays += maxPlays - myArray[ipl].plays;
}
// Choose a random number over the reverse weighted spectrum
picked = ~~(Math.random() * reverseTotPlays);
// Find which array member the random number belongs to
for (ipl = 0; ipl < myArray.length; ++ipl) {
revAcc += maxPlays - myArray[ipl].plays;
if (revAcc > picked) {
return ipl;
}
}
return myArray.length - 1;
}
var pp = [{ plays: 3 }, { plays: 1 }, { plays: 2 }];
console.log(pickRandom(pp));
工作JSFiddle Here
编辑:如果您不想在播放列表中已播放最多次数的歌曲时出现零概率,请在第一次循环后将maxPlays加1.
内容总结
以上是互联网集市为您收集整理的Javascript中的加权随机数生成全部内容,希望文章能够帮你解决Javascript中的加权随机数生成所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。