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

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

ただいまの
回答率

90.11%

time関数を使った乱数発生

解決済

回答 2

投稿

  • 評価
  • クリップ 2
  • VIEW 1,397

hiky

score 22

C言語で乱数を発生させようと考えて最初のコードのようにかきました。
しかし、短い時間で繰り返しが起こるのでtime(NULL)で返される数値が変化しませんでした。
しかし、下のコードのようにかくと数値が変化しました。

下のようにかくとfor文の前で、timer = time(NULL)と代入してまっているので種が変わらずにxの値も変わらない気がします。
とても感覚的な質問になってしまっていますが、お答えできる方がいれば幸いです。

コード
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void){
    double x;  /* 乱数を代入するための変数 */
    int i;    /* for文で使う */
    time_t timer;

    for(i = 0; i < 2; i++){
            timer = time(NULL);  /* 現在の時間 */
            srand(timer);    /* 種を変更   for文が繰り返されるごとに数値が変わることを期待*/
                x = (double)rand() / RAND_MAX;
        printf("%f", x);
        }
        return 0;
}

c
コード

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

int main(void){
    double x;  /* 乱数を代入するための変数 */
    int i;    /* for文で使う */
    time_t timer;

    timer = time(NULL);  /* 現在の時間 */
    srand(timer);    /* 種を変更 */

    for(i = 0; i < 2; i++){
            x = (double)rand() / RAND_MAX;
        printf("%f", x);
        }

    return 0;
}

 

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+2

僕も初心者ですが、感覚的に答えてみます。

おそらくどの言語でも同じだと思うのですが、

srand( seed );


は乱数の順番を決めるようなものと思ってください。
同じ seed からは同じ順番で乱数が出てきます(イメージです)。
そのため、最初のコードのようにループの中で何度も seed を指定し直すと同じ乱数が出力されます。
2番目のコードのようにループの外で seed を指定すれば、その seed の順番に従って乱数が出力されるので違う値になります。

20~30年前、BASICでいろいろやってた時は、乱数の初期化はプログラムの最初に1回だけがお約束だったのですが、最近はそうでもないのでしょうかね?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/08/28 00:08

    rand関数は呼び出しごとに返り値が変わる関数です。その規則を決めるのが、srand関数です。例えば、1番の種を与えたら、rand関数は、514 114 104 260910 …という順で値を返すようになる、と仮定します。上の例は、2回「1の種の先頭からよろしく」(つまり514 514になる)って言っているようなもので、下の例は、「1の種の先頭から2つ用意してくれ」 (つまり514 114)って言っているようなものです。

    キャンセル

+1

乱数を使用する手順は通常以下の通りです。

  1. プログラムの最初にsrand関数で初期化
  2. rand関数で乱数取得
  3. rand関数で乱数取得

つまりsrandはプログラム内で1回実行すればよいです。

こちらで詳しく解説されているので、読んでみてください。
http://www9.plala.or.jp/sgwr-t/lib/srand.html

注意すべきは、

プログラムを実行するたびに異なる系列で擬似乱数を発生させるには

という箇所を「rand関数を実行するたびに」と勘違いしないことです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

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