2012-09-02 39 views
2

假設您有一個任意大小的二維數組,其中偶數的項目在其中。爲了清楚起見,我們還假設您只能在兩個事物之間進行選擇,以將其作爲數組中的給定項。你會如何在數組中的一個給定的索引處進行隨機選擇,但是一旦數組填滿了,你在這兩個選擇之間就會有一個分裂?在數組中創建均勻的隨機數

如果有任何代碼的答案,Java是首選,但其他語言也很好。

+2

實現均勻分割是不太可能的......祝您好運,隨機性。有一個*接近*甚至分裂是更可能的,但是... – oldrinb

+0

我想這是一個微妙的一點,但想象的選擇給出了「校園選擇」的風格。但是,每個人選擇一個任意的人,而不是挑選最好的球員。 – user1086516

+0

所以你想要一個沒有替換的隨機樣本?這聽起來不像你原來的帖子。 – oldrinb

回答

1

你基本上可以用相反的方式思考它。您可以從數組中選擇n/2個元素,並將第一個值放入其中,而不是決定給定的索引。然後將第二個值放在另一個n/2中。

+0

謝謝,非常簡單的方法,但實現了我所需要的。 – user1086516

1

一個2-D A[M,N]數組可以映射到一個矢量V[M*N](您可以使用行主或列主要的順序來執行映射)。

以矢量V[M*N]開頭。用第一個選項填充它的前半部分,用第二個選擇對象填充數組的後半部分。運行Fisher-Yates隨機播放,並將混洗陣列轉換爲二維數組。該數組現在充滿了在這兩個選項中均勻分割的元素,並且每個特定索引處的選項都是隨機的。

+0

+1 ....來自另一方的想法...... – perilbrain

0

以下創建矩陣面積的大小,並用第一個選項(spaces[0])填充一半,第二個填充一半(spaces[1])。之後,它應用洗牌(即Fisher-Yates,通過Collections.shuffle)並開始用這些值填充矩陣。

static <T> void fill(final T[][] matrix, final T... space) { 
    final int w = matrix.length; 
    final int h = matrix[0].length; 
    final int area = w * h; 
    final List<T> sample = new ArrayList<T>(area); 
    final int half = area >> 1; 
    sample.addAll(Collections.nCopies(half, space[0])); 
    sample.addAll(Collections.nCopies(half, space[1])); 
    Collections.shuffle(sample); 
    final Iterator<T> cursor = sample.iterator(); 
    for (int x = w - 1; x >= 0; --x) { 
    final T[] column = matrix[x]; 
    for (int y = h - 1; y >= 0; --y) { 
     column[y] = cursor.next(); 
    } 
    } 
} 
0

僞代碼:

int trues_remaining = size/2; 
int falses_remaining = size/2; 

while (trues_remaining + falses_remaining > 0) 
{ 
    if (trues_remaining > 0) 
    { 
    if (falses_remaining > 0) 
     array.push(getRandomBool()); 
    else 
     array.push(true); 
    } 
    else 
    array.push(false); 
} 

並沒有真正擴展到兩個以上的值,雖然。如何:

assoc_array = { 1 = 4, 2 = 4, 3 = 4, 4 = 4 }; 

while (! assoc_array.isEmpty()) 
{ 
    int index = rand(assoc_array.getNumberOfKeys()); 
    int n = assoc_array.getKeyAtIndex(index); 

    array.push(n); 

    assoc_array[n]--; 
    if (assoc_array[n] <= 0) assoc_array.deleteKey(n); 
} 

編輯:只是注意到你問了一個二維數組。那麼應該很容易將這種方法適用於n維。

EDIT2:從您上面的評論中,「校園選擇」是一個偉大的名字。

0

這聽起來不像你對隨機性的要求非常嚴格,但我認爲我會爲任何可能從中受益的人提供更多的想法。

你基本上要求僞隨機二進制序列,而我所知道的最流行的是maximum length sequence。這使用一個n位寄存器和一個線性反饋移位寄存器來定義一個具有完全平坦頻譜的1和0的週期序列。至少它在一定範圍內是完全平坦的,由序列週期(2^n-1位)決定。

這是什麼意思?基本上,這意味着如果序列的全長被使用,則序列在所有的位移(和頻率)上保證是最大的隨機數。當與隨機數生成器生成的等長序列數相比時,它將包含每個長度的隨機性更大的隨機生成序列。

由於這個原因,它被用於確定系統白噪聲分析中的脈衝函數,特別是當實驗時間有價值並且更高階交叉效應不那麼重要時。由於序列相對於其自身的所有變化是隨機的,因此它的自相關是一個完美的三角函數(除了上面指出的限定符),所以刺激不會污染刺激和響應之間的交叉相關性。

我真的不知道你對這個矩陣的應用是什麼,但如果它只是需要隨機「出現」,那麼這將非常有效地做到這一點。就平衡而言,1與0的比較,序列保證只有一個比0多1。因此,如果你想創建一個2^n的網格,你可以保證得到正確的結果, 0結束。

因此,一個m序列比隨機數生成器產生的任何隨機數更隨機,它具有0和1的定義數。但是,它不允許任意大小的二維矩陣的不合格生成 - 只有那些網格中的元素總數是2的冪的元素。