如何使用JavaScript输出1到10的每个数字,使用随机数字。
如何使用JavaScript输出1到10的每个数字,使用随机数字。
这个问题已经有答案了:
我正在尝试编写一个脚本,它可以输出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或任何其他库 🙂
admin 更改状态以发布 2023年5月23日
你的方法要在每一步都遍历整个数组,看看你的随机数字是否已经在数组中,这意味着浪费了很多时间。
最好的方法是打乱一个有序数组。在每个循环中,我们生成一个随机数(在示例中,一个介于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); });
1) 如何修复您的代码
您有一些错误,其中之一是您没有将inArray
重置为false
,以及您没有遍历整个test
数组(使用<
而不是<=
)。但是使用循环来查看您是否已经有了数字并不高效,最好使用对象作为映射:
var test = []; var amountOfNumbers = 10; var useNumbers = {}; for(var i=0; test.length
2) 如何正确地执行
您的算法将循环,直到运气好到足以找到剩余的数字。这不是高效的,也不是可预测的。正常可靠的做法是
- 生成数组[1..10]
- 混洗它
生成从1到
N
的整数数组可以使用简单的循环或更高级的方法完成:var arr = Array.apply(0,new Array(N)).map(function(_,i){ return i+1 });
混洗数组通常使用Fisher-Yates算法完成,您将很容易找到JS实现(它很容易编写)。一种快速(从理论上讲,不能保证在将来的所有
sort
实现中都能使用)的替代方法是:arr = arr.sort(function(a,b){ return Math.random()>0.5 });