我有一些代码用于将数组中的随机值存储到这样的变量中:
Quest=["value1","value2","value3","value4"];
var random=Math.floor( Math.random() * Quest.length );
var question = Quest[random];
我多次调用第二行和第三行代码,因此不止一次生成相同的值。是否有人知道某些有效的代码以确保不会按顺序重复生成相同的值多次?
答案 0 :(得分:2)
使用数字0到(Quest.length-1)填充数组。
使用this 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>");
}
答案 1 :(得分:2)
您可以使用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()
。
答案 2 :(得分:2)
使用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);
然后,只需从数组的开头到结尾进行迭代。
答案 3 :(得分:1)
另一种可能性是对数组进行随机排序:
function randomOrder() {
return (Math.round(Math.random())-0.5);
}
var Quest = ["value1", "value2", "value3", "value4"];
Quest.sort(randomOrder);
此时你可以走数组,它不应该重复。