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

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

ただいまの
回答率

90.61%

  • C

    3573questions

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

C言語 乱数について

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 1,043

FumiakiNakao

score 138

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

今は

a=(rand()%10)

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+2

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

int main(){
    // 下記のsrandの数字を整数の範囲で変更すると
    srand(1);
    // srandを変更しないと同じ結果が出る。
    printf("%d\n", rand());
    printf("%d\n", rand());
    printf("%d\n", rand());
    printf("%d\n", rand());
    printf("%d\n", rand());

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

srandが固定されていれば同じ値になってしまうので時間によってsrandを設定します。
#include <stdio.h>
#include <stdlib.h>
// time.hを追加
#include <time.h>

int main(){
    // 下記のsrandを時間から設定する。
    srand((unsigned int)time(NULL));
    // randの数字が変化する。
    printf("%d\n", rand());
    printf("%d\n", rand());
    printf("%d\n", rand());
    printf("%d\n", rand());
    printf("%d\n", rand());

    getchar();
    return 0;
}

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

srandの書式は
void srand(unsigned int seed);
引数はunsigned intなので符号なし整数を引数とします。
また、戻り値はvoidなのでありません。

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

本筋でない方向のアドバイスです。
 a=(rand()%10) 
手元の環境では、RAND_MAX は 2147483647なので、この場合に10で割った余りを求めると、0~7の出る確率が8~9の出る確率より僅かに大きくなります。それくらい気にしないよと言うことであればいいのですが。
ちゃんとやるなら、一旦 0<=x<1 の乱数になおして、
   a = (int)((rand()/(double)RAND_MAX)*10);
でしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C

    3573questions

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