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

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

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

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

Q&A

解決済

3回答

4427閲覧

乱数の値が変わらない

h_proc

総合スコア68

C

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

0グッド

0クリップ

投稿2018/12/10 13:32

勝敗がつくまでじゃんけんを続けるプログラムを作っています。(コンピューターの手を乱数で決め、人間の手は入力してもらう)
試しに、3を入力し続けたところ、何回入力しても

printf("You are even.\n"); printf("Choose your hand from 1 to 3.\n"); printf("1 rock\n"); printf("2 paper\n"); printf("3 scissors\n");

が繰り返し表示されてしまいます。どうすればよいのでしょうか。また、ソースコード全体で間違っているところがあれば、ご指摘いただけると嬉しいです。

c

1int get_number(void) { 2 return (int)((((double)rand()) / ((double)RAND_MAX + 1)) * 3) + 1; 3} 4 5int main(void) 6 7{ 8 int h = 0; 9 printf("Let's play rock,paper,scissors!\n"); 10 printf("Choose your hand from 1 to 3.\n"); 11 printf("1 rock\n"); 12 printf("2 paper\n"); 13 printf("3 scissors\n"); 14 15 scanf("%d", &h); 16 17 int m = 0; 18 m = get_number(); 19 20 do { 21 printf("You are even.\n"); 22 printf("Choose your hand from 1 to 3.\n"); 23 printf("1 rock\n"); 24 printf("2 paper\n"); 25 printf("3 scissors\n"); 26 int h = 0; 27 scanf("%d", &h); 28 } while (h == m); 29 if (h == 1 && m == 2) { 30 printf("You are loose!\n"); 31 } 32 else if (h == 1 && m == 3) { 33 printf("You are win!\n"); 34 } 35 else if (h == 2 && m == 1) { 36 printf("You are win!\n"); 37 } 38 else if (h == 2 && m == 3) { 39 printf("You are loose!\n"); 40 } 41 else if (h == 3 && m == 1) { 42 printf("You are loose!\n"); 43 } 44 else if (h == 3 && m == 2) { 45 printf("You are win!\n"); 46 } 47 48 49 return 0; 50}

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

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

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

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

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

y_waiwai

2018/12/10 14:01

どうなることが正解なんでしょうか
h_proc

2018/12/10 14:37

m==hとしているので、ずっとyou are evenが表示され続けるということは、コンピューターがずっと3を提示していると推測でき、乱数になっていないと思いました。
guest

回答3

0

m = get_number();がループの外にあるので、ループの中ではmの値はずっと同じなのが原因です。

投稿2018/12/10 14:04

hichon

総合スコア5737

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

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

h_proc

2018/12/10 14:30

ループの中と外でそれぞれmを定義すればよいのでしょうか。
guest

0

ベストアンサー

C

1#include <stdio.h> 2#include <stdlib.h> 3 4 5int get_number(void) { 6 return (int)((((double)rand()) / ((double)RAND_MAX + 1)) * 3) + 1; 7} 8 9int main(void) { 10 11 12 int a; 13 14 for (a = 0; a < 100; a++) { 15 printf("%d ", get_number()); 16 if ((a % 10) == 9)printf("\n"); 17 } 18 19 while (1); 20} 21

そちらの環境でこのコードを実行したらどうなりますか?

こちらでは、

1 2 1 3 2 2 2 3 3 3
1 3 3 2 1 1 1 2 1 1
3 2 1 1 1 2 2 2 2 2
1 2 2 2 1 2 3 3 2 1
3 3 3 3 2 1 2 1 3 1
3 3 3 3 2 2 1 1 3 1
2 1 3 1 1 3 1 1 2 3
3 3 2 1 3 2 2 3 3 1
2 2 3 2 2 2 1 1 2 3
2 3 3 2 1 2 2 1 3 2

と出力されますねー


m = get_number();

do {

これを、

do { m = get_number();

こーしてみましょう

投稿2018/12/10 14:15

編集2018/12/10 22:26
y_waiwai

総合スコア87719

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

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

h_proc

2018/12/10 14:33

1 2 1 3 2 2 2 3 3 3 1 3 3 2 1 1 1 2 1 1 3 2 1 1 1 2 2 2 2 2 1 2 2 2 1 2 3 3 2 1 3 3 3 3 2 1 2 1 3 1 3 3 3 3 2 2 1 1 3 1 2 1 3 1 1 3 1 1 2 3 3 3 2 1 3 2 2 3 3 1 2 2 3 2 2 2 1 1 2 3 2 3 3 2 1 2 2 1 3 2 と出力されました。
y_waiwai

2018/12/10 14:39 編集

その関数は正常に動作してます。 あなたの使い方が悪いだけですね
y_waiwai

2018/12/10 22:26

回答に追記しました
guest

0

乱数の値が変わらない原因は、他の回答の通りです。
プログラムの単純化、乱数のseed の設定追加, 1,2,3以外の数値入力時の処理追加
をしたコードを示します。

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <time.h> 4 5#define WIN_H (1) 6#define WIN_M (-1) 7#define EVEN_HM (0) 8#define FAILED (999) // 失格 9 10int get_number(void) { 11 return (rand() % 3) + 1; 12} 13 14int judge(int h, int m) { 15 if ((h < 1 || 3 < h) || (m < 1 || 3 < m)) { 16 return FAILED; 17 } else if (h == m) { 18 return EVEN_HM; 19 } else if ((h == 1 && m == 2) || (h == 2 && m == 3) || (h == 3 && m == 1)) { 20 return WIN_M; 21 } 22 return WIN_H; 23} 24 25int main(void) 26{ 27 int result; 28 srand((unsigned)time(NULL)); // 乱数のシードを与える 29 30 for(;;) { 31 printf("Choose your hand from 1 to 3.\n"); 32 printf("1 rock\n"); 33 printf("2 paper\n"); 34 printf("3 scissors\n"); 35 36 int h = 0; 37 scanf("%d", &h); 38 int m = get_number(); 39 result = judge(h, m); 40 if (result != EVEN_HM) { 41 break; 42 } 43 printf("You are even.\n"); 44 } 45 46 if (result == WIN_H) { 47 printf("You are win!\n"); 48 } else if (result == WIN_M) { 49 printf("You are loose!\n"); 50 } else { 51 printf("You are failed!\n"); 52 } 53 return 0; 54} 55

投稿2019/01/06 01:24

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問