2014-12-04 82 views
0

试图规划一个函数,我想获得一些输入。我试图找到一种有效的途径:Java脚本随机数组函数

  1. 双数字阵列中的

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

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

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

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

最后,我写的算法将需要处理的18位数字的初始阵列(因此最终,随机阵列将是尺寸的36)

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

  1. 随机选择新的数组
  2. 0123在一个部位
  3. 检查它是否已满 - 如果它已满,则将选择一个新点并再次检查。
  4. 如果它没有填满,那么它会将值放入新数组中,并转到下一个值。

我没有留下一些细节等,但我希望这个算法相当快,以便用户不会注意到任何东西。

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

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

非常感谢!

+2

1)简明的方法是'var newArr = arr.concat(arr);'。 2)[如何随机化(洗牌)JavaScript数组?](http://stackoverflow.com/q/2450954/218196) – 2014-12-04 16:01:16

回答

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?。有一些相对简单的线性时间运行,不会遇到你所描述的问题,因为它们不需要随机尝试

+0

*“这将是相当复杂的完成”*为什么?如果每个元素在输入数组中都是唯一的,那么'var newArr = arr.reduce(function(narr,v){narr.push(v,v); return narr;},[]);'不是太复杂。 – 2014-12-04 16:05:12

+1

这比将数组与自身连接更复杂,结果将会相同。 – 2014-12-04 16:09:08

+0

感谢您的回复! – user3765881 2014-12-04 23:36:01