我正在尝试制作一个输出1-10中每个数字的脚本。 在JavaScript中使用随机数生成器。
我希望每个数字都是唯一的。 以下是我希望脚本输出的示例:
5 9 7 6 1 3 4 8 2 10
这是我的尝试:
var test = [];
var amountOfNumbers = 10;
var inArray = false;
var useNumbers = [];
for(var i=0; useNumbers.length<=amountOfNumbers; i++){
var rng = Math.floor((Math.random()*amountOfNumbers)+1);
for(var a=0; a<=test.length; a++){
if(rng == test[a]){
inArray == true;
}
}
if(!inArray){
document.write(rng);
test.push(rng);
useNumbers.push(rng);
}
}
希望你能提供帮助。
对于记录我对jQuery和其他任何库都不感兴趣:)
答案 0 :(得分:5)
1)如何修复代码
您有一些错误,其中包括您没有将inArray
重置为false
并且您没有迭代整个test
数组的事实(使用{{1 },而不是<
)。但是使用循环查看您是否已经拥有该数字效率不高,最好将对象用作地图:
<=
2)如何正确地做到
你的算法将循环,直到它足够幸运地找到剩余的数字。这不是有效的,也是不可预测的。正常可靠的做法是
生成从1到var test = [];
var amountOfNumbers = 10;
var useNumbers = {};
for(var i=0; test.length<amountOfNumbers; i++){
var rng = Math.floor((Math.random()*amountOfNumbers)+1);
if(!useNumbers[rng]){
document.write(rng);
test.push(rng);
useNumbers[rng] = true;
}
}
的整数数组可以通过简单的循环或以更高级的方式完成:
N
通常使用Fisher-Yates algorithm对数组进行混洗,为此您可以轻松找到JS实现(无论如何都很容易编写)。快速(理论上不保证可以与所有未来的var arr = Array.apply(0,new Array(N)).map(function(_,i){ return i+1 });
实现一起使用)替代方案是这样的:
sort
答案 1 :(得分:1)
您的方法意味着检查每个步骤中的所有数组,查看您的随机数是否已经在数组中,这意味着很多时间浪费。
最佳方法是使有序数组无序化。在每个循环中,我们生成一个随机数(在这个例子中,一个介于0和1之间的数字),并且以50%的概率我们改变当前位置中的项目,用于随机位置中的其他项目(在0和长度之间)数组)。
希望它有所帮助。
function disorder(arg) {
for (var i = 0; i < arg.length; i++) {
if (Math.random() < 0.5) {
var aux = arg[i];
var rndPos = Math.floor(Math.random()) * arg.length;
arg[i] = arg[rndPos];
arg[rndPos] = aux;
}
}
return arg;
}
var myArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var myNewArray = disorder(myArray);
myNewArray.forEach(function(item) {
console.log(item);
});