我有一些代码用于将数组中的随机值存储到这样的变量中:
Quest=["value1","value2","value3","value4"];
var random=Math.floor( Math.random() * Quest.length );
var question = Quest[random];
我多次调用第二行和第三行代码,因此多次生成相同的值。有没有人知道一些有效的代码来确保相同的值不会按顺序重复生成多次?
我有一些代码用于将数组中的随机值存储到这样的变量中:
Quest=["value1","value2","value3","value4"];
var random=Math.floor( Math.random() * Quest.length );
var question = Quest[random];
我多次调用第二行和第三行代码,因此多次生成相同的值。有没有人知道一些有效的代码来确保相同的值不会按顺序重复生成多次?
用数字 0 到 (Quest.length-1) 填充一个数组。
使用此JavaScript 代码来打乱该数组。
重复:
第一次(t=0),输出数组[t]。
第二次(t=1),输出数组[t]。
当 t%Quest.length(或 array.length)==0 时。
再次洗牌。
并重复。
function shuffle(o)
{
for (var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
return o;
};
Quest = ["value1", "value2", "value3", "value4"];
var myarray = new Array();
var i = 0;
for (i = 0; i < Quest.length; i++) {
myarray[i] = i;
}
shuffle(myarray);
for (i = 0; i < myarray.length; i++) {
document.write(myarray[i]);
}
for (i = 0; i < 50; i++) {
if (i % (Quest.length) == 0) {
shuffle(myarray);
}
document.write("<p>" + Quest[myarray[i % (Quest.length)]] + "</p>");
}
您可以使用splice
以下方法进行操作:
var Quest = ["value1", "value2", "value3", "value4"];
var random1 = Quest.splice(Math.floor(Math.random() * Quest.length), 1)[0];
...
var random2 = Quest.splice(Math.floor(Math.random() * Quest.length), 1)[0];
...
var random3 = Quest.splice(Math.floor(Math.random() * Quest.length), 1)[0];
由于该值已从Quest
数组中删除,因此可以保证问题永远不会重复
演示:http: //jsfiddle.net/dfsq/QUztw/3/
注意:如果您不想修改初始数组,您可以使用它的副本Quest.slice()
。
使用 Fisher-Yates 对数组进行洗牌:
var Quest=["value1","value2","value3","value4"];
function kfy(array)
{
for (var i = array.length - 1; i > 0; --i) {
var p = Math.floor(Math.random() * (i + 1)),
tmp = array[p];
array[p] = array[i];
array[i] = tmp;
}
}
console.log(Quest);
kfy(Quest);
console.log(Quest);
然后,只需从数组的开头迭代到结尾。
另一种可能性是对数组进行随机排序:
function randomOrder() {
return (Math.round(Math.random())-0.5);
}
var Quest = ["value1", "value2", "value3", "value4"];
Quest.sort(randomOrder);
那时您可以遍历阵列并且它不应该重复。