我有两个维度数组,每个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%)。如果第一层中的所有元素具有相同的数组大小但不是这种情况,则此方法将起作用。我也考虑了性能(阵列足够大)
答案 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]
。等等。
基本上,将数组视为一个长的一维数组。