Javascript随机问题?

时间:2010-12-02 02:32:36

标签: javascript random

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

4 个答案:

答案 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 answerDeceze's answer以获取更清洁/替代解决方案。