尝试计划一个函数,我想得到一些输入。我想找到一种有效的方法:
将数组中的数字频率加倍
随机化数组中值的位置。
例如:让我说我有一个数组。 [0,1,2,3]
首先,我想在新数组中复制一次数字。所以现在我们会有这样的事情。
[0,0,1,1,2,2,3,3]
。
最后,我想将这些值随机化:[0,4,2,3,0,2,3,4]
最终,我编写的算法需要处理18位数的初始数组(因此最终的随机数组大小为36)
我最初的想法是只有一个简单的while循环:
我遗漏了一些细节等,但我希望这个算法相当快,以便用户不会注意到任何事情。
我担心的是,当只剩下一个数字时,算法将永远放置它,因为它将有1/36的机会选择空白区域。
一般而言,如何制作更智能,更快速的算法来完成我想要做的事情?
非常感谢!
答案 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]}