JAVAの課題で乱数(0 ~ 10)を配列に入れ、その配列の中には4分の1の確率で0を入れなければならないという課題があります。
この4分の1の確率で0をどう入れることが出来るか分からず困っています。
アドバイスを頂けたら幸いです。
int[] Array = new int[5];
int inputNum = 0;
for(int i = 0; i < Array.Length; i++)
{
// 乱数を配列に入れる。
inputNum = (int)(Math.random * 10);
/*
4分の1の確率で0を出す。
*/
}
*Eclipseを使用しています
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答4件
0
「0か0以外か」を別途乱数で判断するのが一番わかりやすいのではないでしょうか?
java
1int inputNum; 2if((int)(Math.random() * 4) == 0) { // 1/4の確率でここに入る 3 inputNum = 0; 4} else { // 残りの3/4はここに 5 inputNum = (int)(Math.random() * 10) + 1; // 0-9の乱数に1を加え、1-10の乱数を発生 6} 7
投稿2016/05/15 04:01
編集2016/05/15 04:04総合スコア20675
0
既に解決済みではありますが、、
以下のように、全要素のうち1/4を 0 が、残りをその他の値が一様に占める配列を用意し、
その配列に乱数で生成したインデックスでアクセスしてやるのが、最も簡単な方法かと思います。
java
1import java.util.Random; 2 3public class Main { 4 5 private static int[] elements = { 6 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10 }; 11 12 private static Random random = new Random(); 13 14 public static void main(String[] args) { 15 16 int[] Array = new int[5]; 17 18 for (int i = 0; i < Array.length; i++) { 19 20 /* 21 * 4分の1の確率で0を出す。 22 */ 23 int inputNum = elements[random.nextInt(elements.length)]; 24 25 // 乱数を配列に入れる。 26 Array[i] = inputNum; 27 } 28 29 for (int i = 0; i < Array.length; i++) { 30 System.out.println(Array[i]); 31 } 32 } 33 34}
投稿2016/05/15 16:56
総合スコア4791
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
次のような数字列の例 A. B, C. D. を考えます。
質問の場合なら、
D. の数字列からランダムに1つの数字を選べば、
1/4 の確率で 0 が選ばられる
1 .. 10 は それぞれ 3/40 の確率で選ばれる
ことになります。
D. の数字列から、1つをランダムに選ぶ操作は、 たとえば 次のようなコードで実装できます。
java
1int r = random.nextInt(40); # 0, 1, ... 39 の乱数を得る。 2return (r % 4 == 0)? 0: (r / 4) + 1;
実行可能なプログラムとして作成し、 1億回の数字選択をして、 0.. 10 の数字が何回現れるかを表示させてみました。
ほぼ 0 が 1億の 1/4 , その他の数字は、どれもほぼ同じ回数 選択されたことがわかります。
コード全体:
java
1import java.util.Arrays; 2import java.util.HashMap; 3import java.util.Map; 4import java.util.Random; 5import java.util.stream.IntStream; 6 7public class RandomX { 8 9 public static void main(String[] args) { 10 Random random = new Random(); 11 IntStream intStream = random.ints(0, 40); 12 int[] array; 13 int limit = 10; 14 15 // limit = 10; 16 // array = intStream.limit(limit) 17 // .map((x) -> (x % 4 == 0) ? 0 : (x / 4) + 1).toArray(); 18 // System.out.println(Arrays.toString(array)); 19 20 limit = 100_000_000; // 1億 21 Map<Integer, Integer> counts = new HashMap<Integer, Integer>(); 22 array = intStream.limit(limit).map((x) -> (x % 4 == 0) ? 0 : (x / 4) + 1).toArray(); 23 Arrays.stream(array).forEach(x -> counts.put(x, counts.getOrDefault(x, 0) + 1)); 24 System.out.println(counts); 25 } 26}
Stream を使っていますが、エッセンスは、
java
1int r = random.nextInt(40); 2return (r % 4 == 0)? 0: (r / 4) + 1;
です。
乱数については、次のことも参照するとよいです。
参考情報
-
乱数を1億生成する http://qiita.com/kyoshiro-obj/items/b84c7b43162a59b22bfc
-
乱数発生の手法 http://ruby.kyoto-wu.ac.jp/info-com/NumericalModels/RandomProcess/randomnumber.html
補足:
この考え方を延長させると、 0 の出現確率が 1/2, 1/3, ... 1/n になるようにするとか、 n/m (ただし n < m) になるようにすることもできるはずです。
投稿2016/05/15 09:45
編集2016/05/15 13:06総合スコア22328
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
一回の乱数でする方法を考えてみました。
まず、それぞれの数字が現れる確率を考えます。初めに0とそれ以外を考えます。
- 0 … 1/4
- 0以外 … 3/4
0以外は1から10です。それらが平等に現れるなら1/10になります。
- 0 … 1/4 = 10/40
- 1 … 3/4 × 1/10 = 3/40
- 2 … 3/4 × 1/10 = 3/40
- 3 … 3/4 × 1/10 = 3/40
- (中略)
- 9 … 3/4 × 1/10 = 3/40
- 10 … 3/4 × 1/10 = 3/40
つまり、40通りの乱数を生成し、それぞれ0または0以外の数字にすれば良いとなります。40通りなので0から39とすると、10/40になるのは4の倍数の時ですから4で割った余りが0になればわかります。それ以外の時は4で割れば0から9の数字に均等に現れるので、1をたせば1から10の均等な数字になります。
Java
1// Java8での実装例 2class ZeroDake { 3 public static void main(String[] args) { 4 int[] arr = new int[20]; 5 final java.util.Random random = new java.util.Random(); 6 java.util.Arrays.setAll(arr, i -> { 7 final int r = random.nextInt(40); 8 if (r % 4 == 0) { 9 return 0; 10 } else { 11 return r / 4 + 1; 12 } 13 }); 14 for (final int x: arr) { 15 System.out.println(x); 16 } 17 } 18}
投稿2016/05/15 05:11
総合スコア21751
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。