Javascript随机化数组函数

时间:2014-12-04 15:57:32

标签: javascript arrays algorithm random

尝试计划一个函数,我想得到一些输入。我想找到一种有效的方法:

  1. 将数组中的数字频率加倍

  2. 随机化数组中值的位置。

  3. 例如:让我说我有一个数组。 [0,1,2,3]

    1. 首先,我想在新数组中复制一次数字。所以现在我们会有这样的事情。 [0,0,1,1,2,2,3,3]

    2. 最后,我想将这些值随机化:[0,4,2,3,0,2,3,4]

    3. 最终,我编写的算法需要处理18位数的初始数组(因此最终的随机数组大小为36)

      我最初的想法是只有一个简单的while循环:

      1. 随机选择新数组中的一个点
      2. 检查是否已满 - 如果已满,则会选择一个新的位置并再次检查。
      3. 如果它未满,则将值放入新数组中,然后转到下一个值。
      4. 我遗漏了一些细节等,但我希望这个算法相当快,以便用户不会注意到任何事情。

        我担心的是,当只剩下一个数字时,算法将永远放置它,因为它将有1/36的机会选择空白区域。

        一般而言,如何制作更智能,更快速的算法来完成我想要做的事情?

        非常感谢!

2 个答案:

答案 0 :(得分:1)

  

首先,我想在新数组中复制一次数字。所以现在我们会有这样的事情。 [0,0,1,1,2,2,3,3]。

要实现这一目标会相当复杂。由于这些职位无论如何都不相关,只需按

建立[0,1,2,3,0,1,2,3]
var newArray = arr.concat(arr);
  

最后,我想将这些值随机化:[0,4,2,3,0,2,3,4]

只需使用一种公认的随机播放算法 - 请参阅How to randomize (shuffle) a JavaScript array?。有一些相当简单的线性时间运行并且不会遇到您描述的问题,因为它们不需要随机尝试

答案 1 :(得分:0)

我提出了两种阵列的已知方法的替代方案。它提供了相对较好的随机化。

    var array1=[]
    var array=[0,1,2,3,0,1,2,3]
    a=array.length;
    b=a;
    c=b;
    function rand(){for (i=0;i<c;i++){
    n=Math.floor(Math.random()*b);
    array1[i]=array[n]; array.splice(n,1);b--;}
    for (i1=0;i1<c;i1++){array[i1]=array1[i1]}