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

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

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

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

Q&A

解決済

4回答

2348閲覧

C言語 乱数について

FumiakiNakao

総合スコア180

C

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

0グッド

0クリップ

投稿2015/07/23 15:49

C言語で数当てゲームを作るために乱数関数の正式な使い方を知りたいです

今は

a=(rand()%10)

として、aに0~9までの乱数を割り当てるようなコードを書いていますが
コンパイルしなおしてもなぜか値が8から動きません…

自分が使っている本にはrand関数自体が載っておらず、ネットで拾ったコードの猿真似をしている状態です
ので、この機会に正確な文法を知っておきたいです

またsrand関数についても教えていただけると嬉しいです。

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

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

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

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

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

guest

回答4

0

ベストアンサー

srandは乱数を生成するとき元にする数です。
同じ数字が出るとのことですが以下のコードを実行してみるとわかりやすいと思います。

c

1#include <stdio.h> 2#include <stdlib.h> 3 4int main(){ 5 // 下記のsrandの数字を整数の範囲で変更すると 6 srand(1); 7 // srandを変更しないと同じ結果が出る。 8 printf("%d\n", rand()); 9 printf("%d\n", rand()); 10 printf("%d\n", rand()); 11 printf("%d\n", rand()); 12 printf("%d\n", rand()); 13 14 getchar(); 15 return 0; 16}

srandの値が変わればrandの値も変わることが確認できたと思います。
※ANSI Cではsrandが呼び出さる前にrandが呼び出された場合、srand(1)と同じ。

srandが固定されていれば同じ値になってしまうので時間によってsrandを設定します。

c

1#include <stdio.h> 2#include <stdlib.h> 3// time.hを追加 4#include <time.h> 5 6int main(){ 7 // 下記のsrandを時間から設定する。 8 srand((unsigned int)time(NULL)); 9 // randの数字が変化する。 10 printf("%d\n", rand()); 11 printf("%d\n", rand()); 12 printf("%d\n", rand()); 13 printf("%d\n", rand()); 14 printf("%d\n", rand()); 15 16 getchar(); 17 return 0; 18}

また、それぞれの書式は以下のとおりです。

srandの書式は

c

1void srand(unsigned int seed);

引数はunsigned intなので符号なし整数を引数とします。
また、戻り値はvoidなのでありません。

randの書式は

c

1int rand(void);

引数はvoidなので引数なしです。
また、戻り値はintなので整数が戻ってきます。
なので割る数をnとすると、余りは0~n-1の値を得ることができます。

投稿2015/07/23 16:31

hahai

総合スコア50

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

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

0

本筋でない方向のアドバイスです。

a=(rand()%10)

手元の環境では、RAND_MAX2147483647なので、この場合に10で割った余りを求めると、0~7の出る確率が8~9の出る確率より僅かに大きくなります。それくらい気にしないよと言うことであればいいのですが。
ちゃんとやるなら、一旦 0<=x<1 の乱数になおして、

C

1 a = (int)((rand()/(double)RAND_MAX)*10);

でしょうか。

投稿2015/07/24 02:37

otn

総合スコア84505

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

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

0

本筋ではありませんが、私もアドバイスとして次の記事を紹介しておきます。
良い乱数・悪い乱数
上にあるとおり、rand()はかなり質の悪い乱数です。
本格的にゲームなどを作る場合はrand()は使用すべきではありません。
また、暗号などに使う乱数はまた別で、暗号論的擬似乱数生成器が必要です。
使い方を勉強するだけならrand()で十分ですが、まとめると、

  • C標準のrand()は質が悪い。本格的なアプリは違うのを使うべき。
  • 暗号などのセキュリティに関する所は暗号論的擬似乱数生成器というものが必要。

とだけ、覚えておけばいいかと思います。

投稿2015/07/24 13:01

編集2015/07/24 13:03
raccy

総合スコア21735

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

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

0

rand()関数は厳密にはランダムではありません。
実行時に決まった順番で値を返します。
ゲームで使う時は、rand()を常にどっかで呼び出しておいて、
ぐるぐる回しておくか、使う時に、何回か回して、使う

投稿2015/07/24 05:20

MasaakiIrie

総合スコア1021

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問