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

时间:2014-02-12 07:25:57

标签: javascript random

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

2 个答案:

答案 0 :(得分:5)

1)如何修复代码

您有一些错误,其中包括您没有将inArray重置为false并且您没有迭代整个test数组的事实(使用{{1 },而不是<)。但是使用循环查看您是否已经拥有该数字效率不高,最好将对象用作地图:

<=

2)如何正确地做到

你的算法将循环,直到它足够幸运地找到剩余的数字。这不是有效的,也是不可预测的。正常可靠的做法是

  1. 生成数组[1..10]
  2. 将其洗牌
  3. 生成从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

    The whole program

答案 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);
});