乱数

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ykneu

乱数

#1

投稿記事 by ykneu » 9年前

[1] 質問文
 [1.1] 自分が今行いたい事は何か:数あてゲームを作成したい。(乱数で0~99の間の整数を発生させ、キーボード入力で当たるまで何回かかったのか表する。なお入力した数が外れの時、正解より大きかったか、小さかったかを表示)
 [1.4] 今何がわからないのか、知りたいのか:この考えたプログラムだとうまくいかないので間違いを指摘していただきたいです。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
double a,n,x;


srand(time(NULL));

for(n=1; n<RAND_MAX; n++){
x=(int)(100*(double)rand()/(RAND_MAX+1.0));
printf("入力して下さい(0~99)\n");
scanf("%d",&a);
if(a==x){
printf("あたりです。%lf回で。\n",n);
break;
}
else if(a>x){
printf("はずれ。大きいですよ。\n");
}
else if(a<x){
printf("はずれ。小さいですよ。\n");
}
}


return 0;
}
[2] 環境  
 [2.2] コンパイラ名 : gcc

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 乱数

#2

投稿記事 by みけCAT » 9年前

ソースコードを提示する際は、BBCodeを有効にした(無効にしない)状態でcodeタグで囲んでいただけると、見やすくてありがたいです。
ykneu さんが書きました:この考えたプログラムだとうまくいかないので間違いを指摘していただきたいです。
とりあえず致命的な所だけ直すならば、scanfでdouble型の値を読み込むには%dではなく%lfを使わないといけません。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
	double a,n,x;
	

	srand(time(NULL));
	
	for(n=1; n<RAND_MAX; n++){
	x=(int)(100*(double)rand()/(RAND_MAX+1.0));
	printf("入力して下さい(0~99)\n");
	scanf("%lf",&a);
	if(a==x){
		printf("あたりです。%lf回で。\n",n);
		break;
	}
	else if(a>x){
		printf("はずれ。大きいですよ。\n");
	}
	else if(a<x){
		printf("はずれ。小さいですよ。\n");
	}
	}
	

	return 0;
}
他の部分も直すのであれば
  • printfでdouble型の値を表示するには、%lfではなく%fを用いるべきである。
  • そもそも今回のゲームでは整数しか扱わないので、double型ではなくint型を用いるべきである。
  • インデントを整えるべきである。
  • scanfを使用する際は、入力エラーが起きていないかチェックするべきである。
  • ループ回数の上限にRAND_MAXを使用しているのは不自然な仕様である。
  • 二分探索で数を求める有名なゲームではループ中で毎回正解を変えるべきではないが、現在の仕様でも運ゲーとして成立するので修正はしない。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define LOOP_MAX 32768

int main(void)
{
	int a,n,x;

	srand(time(NULL));

	for(n=1; n<LOOP_MAX; n++){
		x=(int)(100*(double)rand()/(RAND_MAX+1.0));
		printf("入力して下さい(0~99)\n");
		if(scanf("%d",&a)!=1){
			printf("入力エラーです。\n");
			break;
		}
		else if(a==x){
			printf("あたりです。%d回で。\n",n);
			break;
		}
		else if(a>x){
			printf("はずれ。大きいですよ。\n");
		}
		else if(a<x){
			printf("はずれ。小さいですよ。\n");
		}
	}

	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 14年前

Re: 乱数

#3

投稿記事 by box » 9年前

ykneu さんが書きました: 当たるまで何回かかったのか表する。
どうもこの部分がスッポリ抜け落ちているように見えます。
入力回数をカウントするための変数を用意する必要があるでしょう。

なお、今の仕様では「ほとんど」当たらないでしょうね。別の回答者さんからの指摘どおり。
まあそれでもよければいいんですが…。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 乱数

#4

投稿記事 by みけCAT » 9年前

box さんが書きました:
ykneu さんが書きました: 当たるまで何回かかったのか表する。
どうもこの部分がスッポリ抜け落ちているように見えます。
見間違いではないでしょうか?
box さんが書きました:入力回数をカウントするための変数を用意する必要があるでしょう。
scanfが呼びだされたら必ず入力されると仮定した場合、nがその役割をしているでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 14年前

Re: 乱数

#5

投稿記事 by box » 9年前

ホントですね。
ま、自分にはどうでもいいことですが…。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

閉鎖

“C言語何でも質問掲示板” へ戻る