0

可能重复:
如何随机化 javascript 数组?

我正在用 JavaScript 编写代码,我需要在其中获取 35 个输入值,为每个输入值分配一个数组中的位置,然后将它们打乱,以便它们以不同的顺序重新排列。像这样:

var sort = new Array(35);
sort[0] = document.getElementById("d1p1").value;
sort[1] = document.getElementById("d1p2").value;
// ...
// ... (till 35)
var rand1 = Math.floor(Math.random() * 35);
var rand2 = Math.floor(Math.random() * 35);
// ...
// ... (till 35)
var rsort = new Array(35);
rsort[rand1] = document.getElementById("d1p1").value;
rsort[rand2] = document.getElementById("d1p2").value;

唯一的问题是,由于 Math.floor(Math.random()*35) 不止一次从 1-35 生成一些相同的数字(嗯,我猜这是随机性的点),所以有时会分配两个值相同的输入框,它们返回undefined。有任何想法吗?

4

2 回答 2

8

为了在随机排列中生成均匀的值分布,您应该这样做:

  • 选择一个从 0 到 35 的随机索引,并将第一个值与该索引交换
  • 然后从 1 到 35 中选择另一个随机索引,并将第二个值与该索引交换
  • 对于所有剩余的索引 (2 - 35) 继续这样

这是一个潜在的实现:

 // first make a copy of the original sort array
 var rsort = new Array(sort.length);
 for(var idx = 0; idx < sort.length; idx++)
 {
     rsort[idx] = sort[idx];
 }

 // then proceed to shuffle the rsort array      
 for(var idx = 0; idx < rsort.length; idx++)
 {
    var swpIdx = idx + Math.floor(Math.random() * (rsort.length - idx));
    // now swap elements at idx and swpIdx
    var tmp = rsort[idx];
    rsort[idx] = rsort[swpIdx];
    rsort[swpIdx] = tmp;
 }
 // here rsort[] will have been randomly shuffled (permuted)

我希望这有帮助。

于 2012-12-25T18:52:24.280 回答
0

您可以使用改编自其他答案的这个小功能。此外,我会使用一个类,以便更容易获取您的所有输入。

function randomArray(min, max) {
  return (new Array(max-min))
    .join(',').split(',')
    .map(function(v,i){ return [Math.random(), min + i]; })
    .sort().map(function(v) { return v[1]; });
}

var inputs = document.querySelectorAll('.myinput');

// Creates an array with all your input elements in random order
var randomInputs = randomArray(0, inputs.length).map(function(n){
  return inputs[ n ];
});

演示: http: //jsbin.com/uyaqed/1/edit(ctrl+enter刷新)

于 2012-12-25T19:05:55.727 回答