質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

4回答

13964閲覧

【JAVA】乱数0を4分の1の確率で出す

amono

総合スコア12

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

1クリップ

投稿2016/05/15 03:54

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

katoy

2016/05/15 21:24

[0.. 1) の範囲の乱数を発生させ、   [0..0.25) の範囲だったら 0,   [0.25 .. 0.25 + 0.075) なら 1,   [0.25 + 0.075 .. 0.25 + 0.075* 2) なら 2 ... のようにすれば、 0.. 10 のすべての出現率を自由に設定できます。
KiyoshiMotoki

2016/05/16 02:17

katoy様 おっしゃる通り、その方法なら 0 だけでなく、 1 〜 10 の出現率も制御できますね。
guest

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;

です。
乱数については、次のことも参照するとよいです。

参考情報

補足:
この考え方を延長させると、 0 の出現確率が 1/2, 1/3, ... 1/n になるようにするとか、 n/m (ただし n < m) になるようにすることもできるはずです。

投稿2016/05/15 09:45

編集2016/05/15 13:06
katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amono

2016/05/15 05:16

丁寧な解説ありがとうございます。理解することが出来ました。
swordone

2016/05/15 06:28 編集

間違えたコメントをしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問