我正在尝试制作一个输出1-10的每个数字的脚本.在JavaScript中使用随机数生成器.
我希望每个数字都是唯一的.这是我希望脚本输出的示例:
5 9 7 6 1 3 4 8 2 10
Run Code Online (Sandbox Code Playgroud)
这是我的尝试:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
希望你能帮忙.
为了记录我对jQuery og任何其他库不感兴趣:)
1)如何修复代码
你有几个错误,其中不重新设置的事实inArray来false和你不遍历整个test阵列(使用<,不<=).但是使用循环查看您是否已经拥有该数字效率不高,最好将对象用作地图:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
2)如何正确地做到这一点
您的算法将循环,直到它足够幸运地找到剩余的数字.这不是有效的,也是不可预测的.通常可靠的做法是
生成从1到1的整数数组N可以通过简单的循环或以更高级的方式完成:
var arr = Array.apply(0,new Array(N)).map(function(_,i){ return i+1 });
Run Code Online (Sandbox Code Playgroud)
通常使用Fisher-Yates算法来对数组进行混洗,您可以轻松地找到JS实现(无论如何都很容易编写).快速(理论上不保证可以与所有未来的sort实现一起使用)替代方案是这样的:
arr = arr.sort(function(a,b){ return Math.random()>0.5 });
Run Code Online (Sandbox Code Playgroud)