我使用一个随机选择另一个函数的函数。 但有时它会连续运行两次甚至更多次的相同功能。
有没有办法预先知道这个?
我目前的代码:
window.setInterval(function(){
var arr = [func1, func2, func3],
rand = Math.floor(Math.random() * arr.length),
randomFunction = arr[rand];
randomFunction();
}, 5000);
到目前为止非常简单。但是如何阻止func1(例如)连续运行两次
答案 0 :(得分:4)
你可以简单地存储最后一个被调用函数的索引,下一次,得到一个不是最后看到的索引的随机数,就像这样
var lastIndex, arr = [func1, func2, func3];
window.setInterval(function() {
var rand;
while ((rand = Math.floor(Math.random() * arr.length)) === lastIndex) ;
arr[(lastIndex = rand)]();
}, 5000);
此处while
循环是关键,
while ((rand = Math.floor(Math.random() * arr.length)) === lastIndex) ;
注意:最后的;
很重要,也就是说循环没有正文。
它将生成一个随机数并将其分配给rand
并检查它是否等于lastIndex
。如果它们相同,则循环将再次运行,直到lastIndex
和rand
不同。
然后将当前rand
值分配给lastIndex
变量,因为我们不希望连续调用相同的函数。
答案 1 :(得分:0)
您可以从0-1中选择随机值。每次运行后,将数组中最近执行的函数与数组中的最后一个元素交换,即arr [2]。
var arr = [func1, func2, func3];
window.setInterval(function(){
var t, rand = Math.floor(Math.random() * (arr.length-1)),
randomFunction = arr[rand];
t = arr[rand], arr[rand] = arr[arr.length-1], arr[arr.length-1] = t;
randomFunction();
}, 5000);
答案 2 :(得分:0)
如何进行简单检查以防止选择与上一个选择匹配的索引?
var arr = [func1, func2, func3, ...];
var previousIndex = false;
var pickedIndex;
if (previousIndex === false) { // never picked anything before
pickedIndex = Math.floor(Math.random() * arr.length);
}
else {
pickedIndex = Math.floor(Math.random() * (arr.length - 1));
if (pickedIndex >= previousIndex) pickedIndex += 1;
}
previousIndex = pickedIndex;
arr[pickedIndex]();
这将在恒定时间内选择一个随机函数,保证与前一个函数不同。