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

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

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

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

Q&A

解決済

4回答

4578閲覧

javaのランダム数字を集計してその数を表示したい

yokkunn

総合スコア1

Java

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

0グッド

0クリップ

投稿2020/06/13 00:03

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
java でランダムに1~6の数字を20回出現させ、その出現した数分を「+」で表現したい。
例)
1:+++
2:++
3:++++
4:+++
5:+++++
6:+++
■■な機能を実装中に以下のエラーメッセージが発生しました。

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

途中までですが、とりあえず1の数を「+」で表示したいのに
1:1:1
と、表示され「+」の表示できません。
初心者で申し訳ないのですがご教授頂ければ幸いです。
エラーメッセージ

### 該当のソースコード java ソースコード for (int i=0; i<20; i++){ int dice =rand.nextInt(6) + 1; int num1 =0; if(dice==1){ num1++; System.out.print("1:"); for(int g =1;g<num1;g++){ System.out.print("+"); } } } } } ### 試したこと ここに問題に対して試したことを記載してください。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答4

0

ランダムに1~6の数字を20回出現させ、その出現した数分を「+」で表現したい。

それぞれの目の頻度を+で表示するんですよね?
1だけならこうですね。(書く場所を入れ替えただけ)

Java

1import java.util.Random; 2 3class Main { 4 public static void main(String[] args) { 5 Random rand = new Random(); 6 int num1 = 0; 7 for (int i = 0; i < 20; i++) { 8 int dice = rand.nextInt(6) + 1; 9 if (dice == 1) { 10 num1++; 11 } 12 } 13 14 System.out.print("1:"); 15 for (int g = 0; g < num1; g++) { 16 System.out.print("+"); 17 } 18 System.out.println(); 19 } 20}

6個ならnum2、num3とやっていってもいいですが、配列を使うとスッキリ書けます。

投稿2020/06/13 03:44

TN8001

総合スコア9862

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

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

dodox86

2020/06/13 04:33

質問者さんのオリジナルのコードに寄り添ったご回答でしたので、高評価させていただきました。
guest

0

ベストアンサー

追記で修正しました:
私の最初の回答は題意を間違えていましたね。20回サイコロを振って、1~6の目についてそれぞれ何回出たかを集計するのが目的の問題でした。修正したものを追記させていただきました。すみません、これは低評価も止む無し、です。


当初の回答(※誤ったもの)

途中までですが、とりあえず1の数を「+」で表示したいのに
1:1:1
と、表示され「+」の表示できません。

とりあえず書いても要望通りには動きません。このレベルでしたら初心者とかあまり関係ありません。落ち着いて考えてみましょう。

if (dice == 1) {...}などとしてしまったら、サイコロの出た目が1の場合しか出力しないと思いませんか。まず、Javaから離れて頭の中、必要なら手を使って紙に書いて考えてみましょう。サイコロの出た目、そのままの回数で+を出力すれば良いということが分かると思います。

Java

1import java.util.Random; 2 3public class t7 { 4 public static void main(String[] args) { 5 Random rand = new Random(); 6 for (int i = 1; i <= 20; i++) { 7 // サイコロを振る 8 int dice = rand.nextInt(6) + 1; 9 10 // 左端の"n:" を出力 11 System.out.print(i + ":"); 12 13 // サイコロの出た目分、'+' をループで出力 14 for (int j = 0; j < dice; j++) { 15 System.out.print("+"); 16 } 17 18 // 最後に改行 19 System.out.println(); 20 } 21 } 22} 23

実行例です。

sh

1$ javac t7.java 2$ java t7 31:+++++ 42:+++ 53:+ 64:++++ 75:+++ 86:+++++ 97:+++++ 108:+ 119:++++ 1210:++++ 1311:++++ 1412:++++++ 1513:+++++ 1614:+++ 1715:+ 1816:+++ 1917:++++ 2018:++++++ 2119:++++++ 2220:+++++ 23$

修正した回答(題意に沿ったもの)

Java

1import java.util.Random; 2 3public class t7b { 4 public static void main(String[] args) { 5 Random rand = new Random(); 6 int[] freqs = new int[6 + 1]; 7 for (int i = 0; i < 20; i++) { 8 // サイコロを振る 9 int dice = rand.nextInt(6) + 1; 10 // 集計 11 freqs[dice]++; 12 } 13 14 for (int i = 1; i < freqs.length; i++) { 15 16 // 左端の"n:" を出力 17 System.out.print(i + ":"); 18 19 // 1~6の目のそれぞれの回数分、'+' をループで出力 20 for (int j = 0; j < freqs[i]; j++) { 21 System.out.print("+"); 22 } 23 24 // 最後に改行 25 System.out.println(); 26 } 27 } 28}

再度の実行例です。

sh

1$ java t7b 21:++ 32:++++ 43:++++ 54:+++++++ 65:++ 76:+ 8$

投稿2020/06/13 01:43

編集2020/06/13 04:32
dodox86

総合スコア9256

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

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

TN8001

2020/06/13 05:03

コメントするつもりだったのですが他にも回答がついてしまい、迷った末に回答にしてしまいました。 余計なお気遣いをさせてすいません。 私も全く同じ答えを用意していましたが、サイコロの目と合わすために配列の0番目(freqs[0])を使わないのがポイントですね。
dodox86

2020/06/13 05:11

>TN8001さん > 余計なお気遣いをさせてすいません。 とんでもございません。誤りに気付かせていただいて感謝いたします。どうもありがとうございます。最初に問題を読み、考えるときに少し違和感はあったのでしたが、明らかにする前に投稿してしまいした。配列インデックスについては0から使うか1から始めてシンプルにするか、この問題に限らずいつも少しだけ悩むところですね。
dodox86

2020/06/14 02:12

あれ? 当初は間違った回答であったののに、BAをいただいてしまって恐縮しています。。。※私的にはTN8001さんのnum1、num2...と配列について言及した回答がベストと思ったものでしたが。
guest

0

for(int g =1;g<num1;g++){

for(int g =0;g<num1;g++){
ではどでしょ

元のコードでは、
forの動作的に、num1が1のときは、g<num1が成立しないので、ループのナカミが全く実行されません

投稿2020/06/13 00:07

編集2020/06/13 00:10
y_waiwai

総合スコア88042

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

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

0

java

1import java.util.Random; 2 3public class Main { 4 public static void main(String[] args) { 5 final int LOOP_COUNT = 5; 6 final String BARS[] = { ":+", ":++", ":+++", ":++++", ":+++++", ":++++++" }; 7 Random r = new Random(); 8 for (int i = 0; i < LOOP_COUNT; i++) { 9 int n = r.nextInt(6); 10 System.out.print(n + 1); 11 System.out.println(BARS[n]); 12 /** 13 n++; 14 String line = "" + n + ":"; 15 for (int j = 0; j < n; j++) { 16 line += "+"; 17 } 18 System.out.println(line); 19 **/ 20 } 21 } 22}

2つの方法を書いてみました。

  • サイコロの目ごとに表示する+の文字列を配列でつくっておいて、それを表示する。
  • サイコロの目の数だけ + をつなげてるようにして、それを表示する。

実行例;
イメージ説明

追記:
私も問題を取り違えてました。
頻度を表示するようにつくりなおしました。

java

1import java.util.Random; 2 3public class Main { 4 public static void main(String[] args) { 5 final int LOOP_COUNT = 100; 6 String bars[] = { 7 "1:", "2:", "3:", "4:", "5:", "6:" }; 8 Random r = new Random(); 9 for (int i = 0; i < LOOP_COUNT; i++) { 10 int n = r.nextInt(6) + 1; 11 bars[n - 1] += "*"; 12 } 13 System.out.println(String.join("\n", bars)); 14 } 15}

イメージ説明

投稿2020/06/13 02:49

編集2020/06/13 05:10
katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問