var swf=["1.swf","2.swf","3.swf"];
var i = Math.floor(Math.random()*swf.length);
alert(swf[i]); // swf[1] >> 2.swf
这种情况,随机输出One
个数字。
如何随机输出two different numbers
?
答案 0 :(得分:4)
var swf = ['1.swf', '2.swf', '3.swf'],
// shuffle
swf = swf.sort(function () { return Math.floor(Math.random() * 3) - 1; });
// use swf[0]
// use swf[1]
即使上述情况应该可以正常运行,但是对于学术上的正确性以及最高的性能和兼容性,您可能希望像这样改变:
var n = swf.length;
for(var i = n - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var tmp = swf[i];
swf[i] = swf[j];
swf[j] = tmp;
}
对tvanfosson和Fisher / Yates的信任。 :)
答案 1 :(得分:2)
您可以使用splice删除所选元素,然后只需随机选择另一个元素。以下内容保留原始数组,但如果没有必要,您可以使用原始数据并省略副本。使用循环显示如何选择任意次数达到原始数组的大小。
var swf=["1.swf","2.swf","3.swf"];
var elementsToChoose = 2;
var copy = swf.slice(0);
var chosen = [];
for (var j = 0; j < elementsToChoose && copy.length; ++j) {
var i = Math.floor(Math.random()*copy.length);
chosen.push( copy.splice(i,1) );
}
for (var j = 0, len = chosen.length; j < len; ++j) {
alert(chosen[j]);
}
答案 2 :(得分:1)
我要做的就是要求两个数字不同(可以更好地回答)
var swf=["1.swf","2.swf","3.swf"]; var i = Math.floor(Math.random()*swf.length); var j; do { j = Math.floor(Math.random()*swf.length); } while (j === i); alert(swf[i]); alert(swf[j]);
修改:应为j===i
答案 3 :(得分:1)
我更喜欢这种方式,因为边界是已知的(你没有得到一个随机数并将它与已有的数据进行比较。它可以循环1或1000次。)
var swf = ['1.swf', '2.swf', '3.swf'],
length = swf.length,
i = Math.floor(Math.random() * length);
firstRandom = swf[i];
// I originally used `delete` operator here. It doesn't remove the member, just
// set its value to `undefined`. Using `splice` is the correct way to do it.
swf.splice(i, 1);
length--;
var j = Math.floor(Math.random() * length),
secondRandom = swf[j];
alert(firstRandom + ' - ' + secondRandom);
Patrick DW告诉我delete
运算符只是将值保留为undefined
。我做了一些谷歌搜索并提出了这个替代解决方案。
请务必检查Tvanfosson's answer或Deceze's answer以获取更清洁/替代解决方案。