&引用;“彩票”;在javascript排序算法中?

&引用;“彩票”;在javascript排序算法中?,javascript,arrays,random,Javascript,Arrays,Random,我试图理解我文章末尾的代码示例,我需要帮助。所以这应该是“彩票”。我看到的是: for( i = 1 ; i < 50 ; i++ ){ nums[ i ] = i ; } (i=1;i

我试图理解我文章末尾的代码示例,我需要帮助。所以这应该是“彩票”。我看到的是:

for( i = 1 ; i < 50 ; i++ ){ nums[ i ] = i ; }
(i=1;i<50;i++){nums[i]=i;} 在这里,它将i的值(介于1和49之间)分配给nums数组的每个第i个元素。所以我猜它只是生成一个包含数字1到49的数组。实际上,考虑到下面的代码,我看不出整行代码的意义

for( i = 1 ; i < 50 ; i++ )
 {
   rand = Math.ceil( Math.random() * 49 ) ;
   temp = nums[ i ] ;
   nums[ i ] = nums[ rand ] ;
   nums[ rand ] =temp ;
 }
(i=1;i<50;i++)的

{
rand=Math.ceil(Math.random()*49);
温度=nums[i];
nums[i]=nums[rand];
nums[rand]=温度;
}

在这里我感到困惑。因此,它再次从1到49运行一个标准循环,对于49次迭代中的每一次,它:

  • 将1到49之间的随机数指定给“rand”

  • 将“nums”列表的第i个值(仍然是i,对吗?)分配给temp(为什么?)

  • 将随机数指定给“nums”数组的第i个元素,因此假设它在i=1时,nums[i]=1,现在不是1,而是随机数

  • 然后它将temp(这是原始值,反正是i)赋回到nums数组rand th位置的值

  • 那么我在这里误解了什么?我不明白这是什么意思。这条路通向哪里?我读对了吗?大概在这个过程结束时,数组中的数字会混乱起来,然后在结束时它只会选择前六个,这是6个“随机”数字。但为什么不做一些类似的事情:

    var nums=[];
    for(i=0; i<6; i++) {
      nums[i] == Math.ceil(Math.random() * 49);
    } 
    
    var nums=[];
    
    对于(i=0;i来说,这确实是一个基本的洗牌。关键是要确保我们只从唯一的数字开始

    执行此洗牌在循环中迭代一次

    检查唯一性需要对循环中的每个元素迭代一次


    对于像这样的小循环,差别基本上为零,但一般来说,当给定两个选项时,您应该选择计算复杂度较低的一个…但请始终记住注释代码以向未来的开发人员解释它!

    该代码应该创建一个数字数组,然后将其洗牌。它几乎使用了一个,但是不完全正确。随机数生成中也有一个错误

    将数字1到49放入数组并不是毫无意义的,它们是以后使用的数字。它们不会被替换,只是在数组中移动

    下一个循环将洗牌数组中的项目,但首先让我们看看随机数的生成。这种创建随机数的方法是错误的:

    rand = Math.ceil(Math.random() * 49); // Don't use this
    

    Math.random()
    方法返回一个值,该值为
    0您对2的假设是不正确的。最初,第i个成员将是i,但随着洗牌的继续,它可能是任何可用的值,因为每个i都被交换到数组中的随机位置。关于0的点是一个可能性,明白了。我不明白为什么我的示例i中的排序是i这是有偏见的,但是如果你基本上是相反的方式(从49开始倒计时)这将是无偏的?你能详细说明是什么使我的例子有偏而你的例子没有偏吗?另外,你解释说这三行基本上是交换数字的——我看到了;但我不明白这是如何确保它们不会重复的?我希望得到一些关于这方面的额外信息!再次感谢!@user3399551:区别在于Fisher-Yates算法只选择左边的一个项目(或相同的项目),而不是整个数组中的一个项目。请注意随机数中的
    *i
    而不是
    *49
    。在我链接的关于Fisher-Yates算法的页面上,在部分中解释了为什么与数组中的任何项目交换时会出现偏差“实现错误”。关于没有重复的数字;数组以数字1到49开始,如果你交换其中两个,它仍然以不同的顺序包含数字1到49。没有引入重复项。好的,我终于得到了它!非常感谢。
    rand = Math.ceil(Math.random() * 49); // Don't use this
    
    rand = Math.floor(Math.random() * 49) + 1;
    
    for (i = 49 ; i >= 1 ; i--) {
      rand = Math.floor(Math.random() * i) + 1;
      temp = nums[i];
      nums[i] = nums[rand];
      nums[rand] = temp;
    }