同样可能从2d数组中选择随机元素

时间:2011-04-20 17:58:13

标签: random multidimensional-array

我有两个维度数组,每个1层元素具有不同的数组大小。例如,它的类似

 first element  1  9
 second element 7
 third element  10 3  2
 fourth element 6  92 14 73

如何从这个2d数组中同样选择一个元素?从2d中选择随机元素的一种明显方法是生成随机数并选择像数组行[first random]并生成第二个该元素的大小,但它不会同样选择一个元素(例如,第二个元素包含1个元素,其他元素的概率大于其他元素的概率小于25%)。如果第一层中的所有元素具有相同的数组大小但不是这种情况,则此方法将起作用。我也考虑了性能(阵列足够大)

4 个答案:

答案 0 :(得分:3)

为什么不将它标准化为一维数组呢?

视觉上,如果你的2D数组看起来像这样:

0:  X X
1:  X
2:  X X X
3:  X X X X

这样想:

0: (X X) (X) (X X X) (X X X X)

为了清晰起见,刚添加括号,以显示原始的每一行被连接成一个长行。

现在你只需要从0到N-1获得一个随机数,其中N是图中'X'的总数。

当然,为了实际访问所选的随机元素,您必须适当地跳过2D数组(参见Jeff Swensen's answer)。

答案 1 :(得分:1)

我会生成一个从1到你的整个元素数的随机数(在你的例子中为10)。然后循环遍历数组的第一级,跟踪到目前为止遇到的元素数量。

即。在psuedo:

randomNumber = rand(1,10)
soFar = 0
for(i=0, i<topLevel.size, i++)
  if ((soFar + topLevel[i].size) > randomNumber)
    return topLevel[i][randomNumber - soFar]
  else
    soFar += topLevel[i].size

答案 2 :(得分:0)

将集合视为长1维数组。生成一个介于0和该数组长度-1之间的随机数。

因此,在您的示例中,您总共有10个项目(0-9表示基于0的索引)。现在每个项目都有相同的选择机会。

您要么必须计算总项目,要么在添加/减去项目时进行维护。

答案 3 :(得分:0)

生成从0到(不包括)(#layer1+#layer2+#layer3+#layer4)的随机数,其中#运算符表示“元素数”。现在,如果随机数介于0#layer1之间,则返回layer1[randomnumber]。等等。

基本上,将数组视为一个长的一维数组。