2011-04-20 60 views
0

我有兩維數組,每一層元素有不同的數組大小。例如,它像從二維數組中挑選隨機元素的可能性相當可能

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

如何挑選從這個二維數組同樣可能的元素?從2d中挑選隨機元素的一個顯而易見的方法是生成隨機數並挑選像[第一個隨機數]的行,並基於該元素的大小生成第二個,但它不會選擇相同可能性的元素(例如第二個元素包含1元素的概率比其他元素的概率高25%,其他元素的概率低於25%)。如果第一層中的所有元素具有相同的數組大小,但不是這種情況,則此方法將工作。我也考慮性能(陣列足夠大)

回答

1

我會從1生成一個隨機數到你的整個元素數(在你的例子中爲10)。然後循環遍歷數組的第一個級別,記錄到目前爲止您遇到了多少元素。

即在僞:

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 
+0

你的僞代碼實際上並不會產生隨機性。如果頂層的第一個元素只包含1個元素,那麼您的代碼很可能會選擇第一個元素,因爲您的if語句的條件(1 <1到10之間的隨機數)始終爲真。 – 2011-04-20 19:22:26

+0

有錯誤的比較運算符,很好捕獲。 – 2011-04-20 19:25:50

0

將集合視爲一個長的一維數組。生成一個介於0和該數組長度-1之間的隨機數。

因此,在您的示例中,您有10個總項目(假定基於0的索引爲0-9)。現在每個項目都有被選中的機會。

您必須計算總項目或在添加/減去項目時進行維護。

0

生成一個從0到(不包括)(#layer1+#layer2+#layer3+#layer4)的隨機數,其中#運算符表示「元素數量」。現在如果隨機數在0#layer1之間,則返回layer1[randomnumber]。等等。

所以基本上,將數組視爲一個長的一維數組。

+0

你的方法有問題,那就是,如果兩層具有數組的大小相同? – 2011-04-20 18:12:54

+0

@ Ha-eun Chung:恩,你能改說嗎? – orlp 2011-04-20 18:14:48

+0

那麼如果#layer 1和#layer 2具有相同的數組大小。您生成0和#layer1之間的隨機數,因爲layer1和layer2具有相同的數組大小,您如何確定選擇圖層? – 2011-04-20 19:17:22

3

爲什麼不將它歸一化爲一維數組?

在視覺上,如果你的二維數組是這樣的:

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)。

相關問題