HTML 个链接的随机排列问题
Problems with shuffling array of HTML links
我是一个 运行 用户浏览子目录的唯一方式是通过随机页面(类似于维基百科的随机页面功能)的站点。我已经实现了调用随机页面的代码并且它工作正常,但我想尽量减少在 onclick 执行后再次调用同一页面的机会。
我在研究更好的方法并尝试将其实现到我的脚本中时偶然发现了 Fisher-Yates-Knuth shuffle:
function Next() {
var links = [];
links[0] = "/arch/g1";
links[1] = "/arch/g2";
links[2] = "/arch/g3";
links[3] = "/arch/g4";
var m = links.length, t, i;
while (m) {
i = Math.floor(Math.random() * m--);
t = links[m];
links[m] = links[i];
links[i] = t;
}
window.location = links[m]
}
脚本基本可以,但是还是会导致同一个页面连续调用2次甚至3次。我对 JS 还是很陌生,所以如果有人能给我指明正确的方向就太好了。
每次调用 Next() 函数都是随机排列链接数组并从数组中获取一个索引。你有 4 个不同的链接,调用此函数 3 次你很有可能获得相同的页面。
试试这个:
var links = ["/arch/g1","/arch/g2","/arch/g3","/arch/g4"];
function shuffle(links) {
var m = links.length, t, i;
while (m) {
i = Math.floor(Math.random() * m--);
t = links[m];
links[m] = links[i];
links[i] = t;
}
}
function Next(){
if(links.length === 0){
links = ["/arch/g1","/arch/g2","/arch/g3","/arch/g4"];
shuffle(links);
}
var nextUrl = links[links.length - 1];
links.splice(links.length - 1, 1);
window.location = nextUrl;
}
我是一个 运行 用户浏览子目录的唯一方式是通过随机页面(类似于维基百科的随机页面功能)的站点。我已经实现了调用随机页面的代码并且它工作正常,但我想尽量减少在 onclick 执行后再次调用同一页面的机会。
我在研究更好的方法并尝试将其实现到我的脚本中时偶然发现了 Fisher-Yates-Knuth shuffle:
function Next() {
var links = [];
links[0] = "/arch/g1";
links[1] = "/arch/g2";
links[2] = "/arch/g3";
links[3] = "/arch/g4";
var m = links.length, t, i;
while (m) {
i = Math.floor(Math.random() * m--);
t = links[m];
links[m] = links[i];
links[i] = t;
}
window.location = links[m]
}
脚本基本可以,但是还是会导致同一个页面连续调用2次甚至3次。我对 JS 还是很陌生,所以如果有人能给我指明正确的方向就太好了。
每次调用 Next() 函数都是随机排列链接数组并从数组中获取一个索引。你有 4 个不同的链接,调用此函数 3 次你很有可能获得相同的页面。
试试这个:
var links = ["/arch/g1","/arch/g2","/arch/g3","/arch/g4"];
function shuffle(links) {
var m = links.length, t, i;
while (m) {
i = Math.floor(Math.random() * m--);
t = links[m];
links[m] = links[i];
links[i] = t;
}
}
function Next(){
if(links.length === 0){
links = ["/arch/g1","/arch/g2","/arch/g3","/arch/g4"];
shuffle(links);
}
var nextUrl = links[links.length - 1];
links.splice(links.length - 1, 1);
window.location = nextUrl;
}