2016-05-25 4 views
0

random()関数がランダムであり、[0, 1]の範囲の値を返すと仮定します。この方法を使用する場合、結果のtrueの値はアレイの方向に偏っていますか?固定量のランダムな真の値が偏っていることを保証するこの方法はありますか?

int chances = 16; 
    int guaranteed = 6; 
    boolean[] result = new boolean[chances]; 
    for (int i = 0; i < result.length; i++) { 
     if (random() <= (float) guaranteed/chances) { 
      result[i] = true; 
      guaranteed--; 
     } 
     chances--; 
    } 
+0

コードのベンチマークを試しましたか?それは1000回実行し、結果が何かを参照してください。 –

+0

あなたは正しいです。私の悪い。それはランダムであるように見えます。ありがとう。 – iHaveNoIdeaWhatImDoing

+1

サイドノート: 'float'を使う理由がない限り、' double'を使います。 –

答えて

0

あなたは16のうち、6つのtrue値を強制したい場合、あなたは1と16(または0の間でランダムに6つのインデックスを削除する必要があることを行うには1と16の間にランダムに6つのポジションを選択する必要がありますし、ゼロベース配列の場合は15)

ここでその方法を説明します。アイデアは、選択されたすべてのインデックスをインデックスの配列の後ろに送信して、それを再び選択しないようにすることです。

  1. n := 16
  2. indexes := (1, ..., 16)
  3. boolean := (false, ..., false) // 16回
  4. 6 times repeat:

    i := integerRandom(1, n). 
        ki := indexes[i]. 
        swap(indexes, n, ki). 
        boolean[ki] := true. 
        n := n - 1 
    
  5. return boolean

関連する問題