我有一个有时会更新的数组,所以数组的大小是任意的。
我想从数组中获得一个非重复的索引(注意:不是索引处的元素,而是索引)。
该程序每1000毫秒运行一次,我正在尝试获取唯一索引。
这是我到目前为止所拥有的:
randomIndex = data => {
let rand = Math.floor(Math.random() * data.length);
if (rand !== Math.floor(Math.random() * data.length)) {
return rand;
} else {
return Math.floor(Math.random() * data.length);
}
};
但是仍然会返回重复值
假设我们有data = ['bob', 'charli', 'kate']
我想获得一个随机指数e.i. 0或1或2。
因为我目前有setInterval(() => {}, 1000)
,所以我在1000秒后得到了相同的索引,这不是我想要的。因此,每一秒钟,我需要一个不同的索引。
请注意,当我说不重复时,我的意思是我不希望同一索引连续出现。
所以说1s之后我们有索引1,然后是1,我想要0或2。
答案 0 :(得分:1)
您需要跟踪索引的历史记录,以避免重复。本示例还使用递归来继续尝试查找唯一索引。如果没有唯一的变量,请重置历史记录数组。希望这会有所帮助!
编辑:
看起来您实际上不需要跟踪“历史记录”,而只需跟踪最后选择的索引。这应该可以让您到达需要的地方。
let people = ['bob', 'charli', 'kate', 'bobby', 'jake', 'john', 'jerry', 'isaac'];
let lastIndex;
getRandIndex = (data) => {
let rand = Math.floor(Math.random() * (data.length));
if (!lastIndex) {
lastIndex = rand;
return rand
}
if (rand != lastIndex) {
lastIndex = rand;
return rand;
} else {
return getRandIndex(data);
}
};
setInterval(() => {
console.log(getRandIndex(people))
}, 1000)
答案 1 :(得分:0)
要执行任务,您需要使用/matchup-history?matchup_type=regular&owner_id=98765
语言构造,如果当前随机数与最后一个相同,它将继续生成一个新的随机数。
下面是一段说明:
在代码段中,我将使用
do...while
方法,该方法不允许回调函数(第一个参数)返回值,因此您可以将生成的数字分配给变量,然后停止通过使用setInterval
方法使用参考变量(分配给setInterval
方法的变量)的时间间隔。而且,我在5秒后结束间隔。
clearInterval
希望我进一步推动了你。
答案 2 :(得分:0)
只需此功能:
let people = ['bob', 'charli', 'kate', 'bobby', 'jake', 'john', 'jerry', 'isaac'];
getRandIndex = (data, noRepeat) => {
rand = Math.floor(Math.random() * (data.length));
while(noRepeat === rand) {
rand = Math.floor(Math.random() * (data.length));
}
return rand;
};
let r = -1;
setInterval(() => {
r = getRandIndex(people, r);
console.log(r);
}, 1000)
答案 3 :(得分:0)
一种简单而干净的方法
let previous = 0;
getRandIndex = (data) => {
const rand = Math.floor(Math.random() * data.length);
if(rand == previous) return getRandIndex(data);
previous = rand;
return rand;
};