如何输出从1到10的每个数字.在JavaScript中使用随机数

Kri*_*ard 0 javascript random

我正在尝试制作一个输出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任何其他库不感兴趣:)

Den*_*ret 5

1)如何修复代码

你有几个错误,其中不重新设置的事实inArrayfalse和你不遍历整个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..10]
  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)

整个计划