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

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

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

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

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Q&A

2回答

2684閲覧

java 乱数 繰り返し回数

gogomi

総合スコア0

Java

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

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

0グッド

1クリップ

投稿2021/06/16 12:39

編集2021/06/16 13:12
package Renshu; public class Toi { public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ while(true) { int x,kaisu; kaisu=0; x=(int)(11*Math.random()); System.out.println("x>>"+x); for(int i=0;x==0;i++) { kaisu++; System.out.println("0が出るまでの繰り返し回数は"+kaisu+"回です"); break; } } } } ```### 前提・実現したいこと javaで、0から5までの整数乱数を繰り返し、0がでたら、「0が出るまでの繰り返し回数は〇回です」と出力して終了するプログラムを作成する課題を出されたのですが、一向に進まず、困っています。 実行自体はできるのですが、乱数で0が出ても止まらず、無限ループしてしまいます。また、一応0が出た後に、0がでるまでの~の分は出るのですが、0が出るまでに何個か出ていても、回数が一回のままになってしまいます。 while文の単元なので、while文を使用した方法を教えてくださると助かります。 ### 試したこと

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

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

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

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

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

BeatStar

2021/06/16 12:43

コードは "<code>"または "<コード>"のボタンを押して出てくるやつに書きましょう。 インデントが無視されて読みづらいです。 編集ができるので、編集しましょう。
BeatStar

2021/06/16 12:56

また、『一向に進まない』とか『うまくいかない』ではなく、 『どのようにうまくいかないのか』や『どこができないのか』等のように書いてください。 今の質問では『主観的なもの』ですから、誰にもわかりません。
guest

回答2

0

BeatStarさんの指摘を是非やって頂きたい。
そしてその説明通り、今の実装が説明の通りになっているか確認してください。

とはいえ、恐らく実装できていると判断になるかもしれません。

何故なら、根本的な問題としてforの使い方を勘違いしています。
改めてforの構文を確認してみてください。
想定している処理と実装が異なっていることにすぐ気づくと思います。

投稿2021/06/16 13:47

Crimson_Tide

総合スコア509

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

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

0

まず、どういうロジック(論理)で組んだのかを説明できますか?

つまり、『日本語なりの自然言語で説明してくれ』です。

ご自分で考えられているようなのでダメとは言いませんが、無駄が多い気がします。

まず、プログラミングは『こう書けばいい』ではなく、

プログラムは魔法でもなんでもなく、人間が現実世界でやっていることを逐一指示されながら処理しているだけの代物である』です。

つまり、『現実世界でならどうするか』です。

今回の場合、言い換えると、

[依頼] あなたは0~5までの目で構成されているさいころがあり、そのさいころを振っていき、 0が出るまで繰り返します。 そして、0が出たら、『0が出るまでの繰り返し回数は〇回です』と言ってください。

みたいなものですね。

私なら、

1. 0が出るまで以下を繰り返す 1.1. さいころを振る 1.2. 出た目が0かどうか調べ, 1.2.1. (0であれば)終了する 1.3. それ以外(0以外の目)なら 1.3.1. カウントする 2. 結果発表

的な感じにすると思います。

後はこれを実装すればいいだけです。

(1)は while(true) なり、while + 『0以外なら』系でループさせる。

(1.2) は 乱数発行。(1.2.1) は if文とその条件式で実装可能。

...と言う風にやる。

後はこれをコーディングし、デバッグし、テストする。

これだけです。


[追記1]

実行自体はできるのですが、乱数で0が出ても止まらず、無限ループしてしまいます

当たり前です。

ロジックを読みましょう。

他人が書いたコードや自分が書いたコード、なんでもいいですが、とにかくコードを読むときは、
一行レベルで、なにをやっているかを考えながら読むです。

たとえばコメント文として記述するとかです。

Java

1package Renshu; 2 3public class Toi { 4 public static void main(String[] args) { 5 6 // 条件式: true.(= つまり無限ループ) 7 while(true) { 8 // 変数x, kaisuを宣言 9 int x,kaisu; 10 // kaisu に 0 を代入する 11 kaisu=0; 12 // x は 乱数……発行? 13 x=(int)(11*Math.random()); 14 // "x>>" + x を出力 15 System.out.println("x>>"+x); 16 // iの初期値: 0, xが 0である間, i++ しながら処理 17 for(int i=0;x==0;i++) { 18 // kaisu をインクリメント( i = i + 1 ) 19 kaisu++; 20 // "0が出るまで..." と表示 21 System.out.println("0が出るまでの繰り返し回数は"+kaisu+"回です"); 22 // ブロックから強制的に抜ける 23 break; 24 } 25 } 26 } 27}

ですね。

これを日本語でも英語でも韓国語でもスペイン語でもなんでもいいので、自分が読み書きできる言語で書き下しましょう。

Java

11. 以下を無限ループ 2 1.1. 変数x, kaisuを宣言 3 1.2. kaisuに0を代入 4 1.3. 乱数発行(?)しているのかな 5 1.4. iの初期値を0とし, xが0である間, インクリメントしながら以下を処理 6 1.4.1. kaisu をインクリメント 7 1.4.2. "0が出るまで..."云々のメッセージ表示 8 1.4.3. ブロックから強制的に抜ける( (1.4)だけ抜けて(1)に戻る )

これを現実世界でやってみましょう。
つまり、手作業で、(1)から(1.4.3)をやってみましょう。

脳内でもいいです。

そうすると、めちゃくちゃなロジックだという事が分かります。

なぜ、kaisuを(1.1) で宣言しているのでしょうか。
なぜ kaisuの初期値(厳密には代入)を(1.2)でやっているのでしょうか。

この場所でやると、(1)に戻る時には(厳密には(1.4)の後ぐらい) 破棄されるので意味がありません。

現実世界で考えてみてください。

今のやり方ですと、

ホワイトボードにカウントしていく。 でも次の乱数発行の際にはそのホワイトボードの内容をすべて消す。 また書いていく。(もちろん0から)

いつまでたっても kaisu > 0 にはなりません。(結果としてはね)

(1.4)の 『iの初期値を0とし, xが0である間, インクリメントしながら以下を処理』も変。

数直線で書いてみてください。

i 用と x 用です。

そうすると、何か変であることがわかるはずです。

x に代入したりとかしていないので、よくて x = 0 、悪ければ(そもそも初期化すらしていないので) でたらめな値になっているはずです。

C言語では、初期値を与えないと 0 または不定値( でたらめな値 ) が入ります。

言語によっては違うかもしれませんが、そういう風に 0 以外の値になっている可能性もあります。

仮に x = 0 だとしても、 『x が0である間』なのでこれも無限ループに陥る可能性がある。

(ただし、他の部分で落ちるが)

(1.4.2) での『"0が出るまで..."云々のメッセージ表示』も変。

日本語なり英語なりの自分が読み書きできる言語で考えてみてください。

そうすると、変であることがわかるはずです。

なんでここで表示しているのでしょうか。

投稿2021/06/16 12:54

編集2021/06/16 13:50
BeatStar

総合スコア4962

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問