我在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 。有什么想法吗?
答案 0 :(得分:6)
为了在随机排列中生成统一的值分布,您应该做的是这样做:
这是一个潜在的实施方案:
// 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)
我希望这会有所帮助。
答案 1 :(得分:-1)
您可以使用此other answer改编的小功能。此外,我会使用一个类,以便更容易获取所有输入。
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键进入刷新状态)