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

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

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

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

Q&A

解決済

3回答

1582閲覧

玉の出現確率をJavaで出したい。

HAL8787

総合スコア1

Java

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

0グッド

0クリップ

投稿2022/01/22 04:52

編集2022/01/22 17:58

前提・実現したいこと

袋の中に入っている5つの玉「赤玉」「青玉」「黒玉」「緑玉」「黄玉」を ランダムに1つ取り出して玉の色を確認する、取り出した玉は確認後にもとに戻してもう一度、ランダムに1つ取り出す作業を 1000回繰り返したときにそれぞれの玉の出現する確率を出す。

Rubyのは既出でしたが、それをJavaで書こうとしてうまくいかなかったので投稿します。

発生している問題・エラーメッセージ

何度やっても結果として0.0が1000回出力する。

該当のソースコード

Java

1import java.util.Random; 2 3public class Main { 4 public static void main(String[] args) { 5//変数の定義 6 int[] count = {0,0,0,0,0}; 7 Random random = new Random(); 8 int randomValue = random.nextInt(5); 9 int max = 1000; 10 String[] ball = {"赤玉","青玉","黒玉","緑玉","黄玉"}; 11 12 for(int i=0;i<=max;i++){ 13 if (ball.equals("赤玉")){ 14 ++count[0]; 15 }else if (ball.equals("青玉")){ 16 ++count[1]; 17 }else if (ball.equals("黒玉")){ 18 ++count[2]; 19 }else if (ball.equals("緑玉")){ 20 ++count[3]; 21 }else{ 22 ++count[4]; 23 24 //出力結果 25 double answer = (double)((count[randomValue]/max)*100); 26 System.out.println(answer); 27 } 28 } 29 } 30}

試したこと

//出力結果以降を以下に修正しても、結果は2.で記載したとおりになります。
System.out.println((double)((count[0]/max)*100)); System.out.println((double)((count[1]/max)*100)); System.out.println((double)((count[2]/max)*100)); System.out.println((double)((count[3]/max)*100)); System.out.println((double)((count[4]/max)*100));
count配列のそれぞれの要素に1ずつインクリメントして、1000回玉の出し入れを実施して、それぞれの玉の出現回数を求めようとしてますが、それがうまくいってないのだろうと思いますが、これ以上はどう修正すれば良いのでしょうか?

補足情報(FW/ツールのバージョンなど)

JDK→javac 1.8.0_311

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

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

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

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

m.ts10806

2022/01/22 04:59

インデントぐちゃぐちゃで非常に読みづらいのですけど、 現状のコードだと閉じ}が1つ足りなくてエラー出ます。 あと ++count[4]; の分岐でしかprintしてないようですけど、これは意図通りの実装ですか?
m.ts10806

2022/01/22 05:03

あとString[]を直接equalsでStringと比較してもその条件式を満たすことはないのでは。
HAL8787

2022/01/22 08:02

}はコピーミスでしたので追記しました。 >++count[4]; の分岐でしかprintしてないようですけど、これは意図通りの実装ですか? →意図通りではないですが、++count[4];の分岐でしかprintされてないのは出力結果的にも薄々とは感づいてました・・・ String[]を直接equalsでStringと比較してもtrueにならないんですねわかりました。 ご指摘ありがとうございます。
guest

回答3

0

if (ball.equals("赤玉")){

ball と"赤玉"が等しいかどうかを判断してるんだろうけど、
残念ながらballは文字列じゃありません
文字列のなにと比較しようと、この条件がtrueになることはないです

投稿2022/01/22 05:19

y_waiwai

総合スコア87715

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

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

HAL8787

2022/01/22 08:06

ball と"赤玉"を比較してもtrueにはならないのですねわかりました、ありがとうございます。
guest

0

0.0と出る理由はともかく、インデントのせいか意図通りか別としてprintされてるのがforの中且つ4のときしかないです。

ひとまず「何が何回出たか」というのを正しく出せるようになってからかと思います。

java

1 public static void main(String[] args) { 2 int[] count = { 0, 0, 0, 0, 0 }; 3 int max = 1000; 4 String[] balls = { "赤玉", "青玉", "黒玉", "緑玉", "黄玉" }; 5 6 for (int i = 0; i < max; i++) { 7 Random random = new Random(); 8 int randomValue = random.nextInt(balls.length); 9 ++count[randomValue]; 10 } 11 12 for (int i = 0; i < balls.length; i++) { 13 double answer = count[i] / max * 100; 14 System.out.println(balls[i]+":"+count[i]+"/"+max ); 15 } 16 }

加算する先とランダムの結果はイコールになるのでballの中を取り出して比較のようなことはせずとも単純に加算すれば良いと思いますし、String[]とStringを比較しているのでtrueになることはないです。

投稿2022/01/22 05:14

m.ts10806

総合スコア80731

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

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

m.ts10806

2022/01/22 05:15

あと細かいですが0開始で<=1000なので正確には1001回です。 ※この1回の違いって結構デカいです。仕様が変わります。
HAL8787

2022/01/22 08:05

加算する先とランダムの結果はイコールになるのでballの中を取り出して比較しなくても単純に加算すれば良い、String[]とStringを比較しているのでtrueにならない、<=1000ではなく<1000と表記ですね。わかりました。回答ありがとうございます。
m.ts10806

2022/01/22 08:58

回答の主旨は「インデントちゃんとつけましょう」です。
guest

0

ベストアンサー

java では整数型同士の演算は全て(個々の演算の単位で)整数型に変換されながら行われます。
率を求める式の要素何れかを double にキャストしては如何でしょうか。

なお、ご提示のプログラムは「袋の中に入っている5つの玉「赤玉」「青玉」「黒玉」「緑玉」「黄玉」を ~ それぞれの玉の出現する確率を出す。」ようなものになっておりません。
そちらをまずお考えになったほうが良いのではないでしょうか。

java

1import java.util.Random; 2 3public class Main { 4 public static void main(String[] args) { 5 Random random = new Random(); 6 int max = 1000; 7 String[] ball = {"赤玉","青玉","黒玉","緑玉","黄玉"}; 8 int[] count = new int[ball.length]; 9 10 for(int i=0; i<max; i++) { 11 count[random.nextInt(ball.length)] ++; 12 } 13 14 for(int i=0; i<ball.length; i++) { 15 System.out.println(ball[i]+":"+(double)count[i]/max*100); 16 } 17 } 18}

投稿2022/01/22 04:57

編集2022/01/22 05:11
jimbe

総合スコア12512

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

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

HAL8787

2022/01/22 08:09

解決しました、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問