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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

1572閲覧

C言語で無限ループをbreakすることができない

panamax

総合スコア22

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/08/13 04:15

C言語を勉強中に分からないことがあったので,質問させていただきます.

まず,以下のような実装を求められました.

「whileの無限ループを作り、その中で、1から10までの乱数を発生させて、表示しなさい。その際、値が10になったら、ループを抜け、”終了します”と表示してプログラムを終えるようにしなさい。」

これに対して私は次のようなコードを書きました.

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <time.h> 4 5int main(void){ 6 7int n; 8 9while(1){ 10 srand((unsigned)time(NULL)); 11 n = rand()%10+1; 12 printf("%d\n", n); 13 if(n==10){ 14 printf("終了します\n"); 15 break; 16 } 17 } 18}

しかし,このコードの実行結果は1から10のどれか1つがずっと表示され続ける無限ループになってしまいます.私の書いたコードのどこが間違っているのでしょうか?

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

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

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

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

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

guest

回答4

0

srand関数をwhile文に入る前に書いたらどうでしょうか?

投稿2018/08/13 04:27

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

srand関数というのは、rand関数の初期化用の関数です
ですんでsrandを実行したあとのrandの返り値は常に一定となってしまいます
ということで、srandは、最初に一回だけ実行し、その後のループではrandだけを実行し続ければ、乱数(っぽい)数字列が生成されます

投稿2018/08/13 04:32

y_waiwai

総合スコア87749

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

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

0

rand()は、バラバラな数字の羅列の先頭から順番に一つ値を取り出す関数です。
ビンゴゲームのカードの左上から順に数字を読み上げるようなイメージですね。

一方、srand()はビンゴゲームの例えで言うとカードを作る(カードに数字を並べる)ような役割です。
で、そのカードがどのような数字の並びになるかは引数に渡した値で決まります。
同じ値を渡すと同じ並びのカードができてしまいます。
普通はプログラム起動時にそのときの時刻(毎回違うはずですよね)を渡してプログラムの中で一度だけ呼び出せば良いです。
あとはrand()で先頭から順番に値を取り出して使えば良いですね。

ところが質問者さんのコードだと無限ループの中で何度もsrand()を呼び出すことになってしまい、且つそのループが超高速で回るため
srand()に同じ時刻を何度も渡すことになり、同じ数字の並びのビンゴカードを何度も作り直すようなことになっています。
rand()で同じビンゴカードの左上から値を取得すれば、そりゃ毎回同じ値になってしまいますよね。


細かいことを言うと上記のままというわけでは無いのですが、初学者にとってイメージしやすいかと思い私はビンゴカードの例えをよく用いています。

投稿2018/08/13 04:54

illusionist

総合スコア62

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

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

0

参考情報

  • rand関数でランダムな値を生成する

http://c.zombie-hunting-club.com/entry/2017/11/04/134724
time, srand rand の使い方が説明されています。

投稿2018/08/13 04:52

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問