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

40 浏览
0 Comments

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

这个问题已经有答案了:

如何对JavaScript数组进行随机化(洗牌)?

我正在尝试编写一个脚本,它可以输出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
0 Comments

你的方法要在每一步都遍历整个数组,看看你的随机数字是否已经在数组中,这意味着浪费了很多时间。

最好的方法是打乱一个有序数组。在每个循环中,我们生成一个随机数(在示例中,一个介于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);
});

0
0 Comments

1) 如何修复您的代码

您有一些错误,其中之一是您没有将inArray重置为false,以及您没有遍历整个test数组(使用<而不是<=)。但是使用循环来查看您是否已经有了数字并不高效,最好使用对象作为映射:

var test = [];
var amountOfNumbers = 10;
var useNumbers = {};
for(var i=0; test.length

2) 如何正确地执行

您的算法将循环,直到运气好到足以找到剩余的数字。这不是高效的,也不是可预测的。正常可靠的做法是

  1. 生成数组[1..10]
  2. 混洗它

生成从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 });

整个程序

0