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

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

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

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

解決済

【C】srand(time(NULL))をしても同じ乱数が生成される

shuta_202141
shuta_202141

総合スコア43

C

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

3回答

2評価

1クリップ

7961閲覧

投稿2021/12/27 09:57

編集2021/12/27 10:07

###問題点
0〜6の乱数を生成して6段階のおみくじを出力するプログラムを作成しています。srand(time(NULL))で乱数のシードを設定しているのですが毎回出力が6になってしまいます。srandが機能していないのはわかるのですがどう改善すればいいのか教えていただきたいです。

###該当コード

C

//おみくじ #include <time.h> #include <stdlib.h> #include <stdio.h> #include <string.h> int Omikuji(void); //プロトタイプ宣言 int main(void) { Omikuji(); return 0; } int Omikuji(void) { int num; //乱数 char luck[20]; //吉凶 srand(time(NULL)); //乱数のシード num = rand() % 7; //乱数生成 switch (num) { case 0: strcpy(luck, "大吉"); break; case 1: strcpy(luck, "中吉"); break; case 2: strcpy(luck, "小吉"); break; case 3: strcpy(luck, "吉"); break; case 4: strcpy(luck, "末吉"); break; case 5: strcpy(luck, "凶"); break; case 6: strcpy(luck, "大凶"); break; } printf("%d あなたの吉凶は:%s\n", num, luck); //結果の表示 return 0; }

###実行結果

6 あなたの吉凶は:大凶

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

itagagaki

2021/12/27 10:06

実行結果をどうやって確認しましたか? 提示のコードをそのままコンパイルし、1秒以上の間隔をあけて実行したら、そのたびに違う結果が出ましたよ。
shuta_202141

2021/12/27 10:08

code runnerで実行をしました。すいません。実行結果を掲載し忘れていました。
itagagaki

2021/12/27 10:10

1秒以上の時間をあけて実行しましたか? time(NULL)の値は秒単位なので、1秒以上たたないと同じ値になります。
shuta_202141

2021/12/27 10:17

はい空けています。乱数生成の簡単なプログラムを作ってみたのですが、そちらですと毎回ちがう乱数が生成されます。
itagagaki

2021/12/27 10:20 編集

不思議ですね。 timeの返値を確認してみては。 time_t t; t = time(NULL); srand(t); printf("%ld %d あなたの吉凶は:%s\n", t, num, luck);
shuta_202141

2021/12/27 10:22

なぜかrand() % 5や6にすると違う乱数が生成されるのに7した途端6だけしか生成されません。不思議です。
shuta_202141

2021/12/27 10:23

1640600587 6 あなたの吉凶は:大凶 1640600589 6 あなたの吉凶は:大凶 1640600593 6 あなたの吉凶は:大凶 確かにシードは違うのに6しか生成されていないみたいですね
itagagaki

2021/12/27 10:27

提示のコードにおかしなところは無いし、それを私の環境で実行してもそのような不思議なことは起こらなかったし、そちらの環境(コンパイラやライブラリ)がおかしいというのも考えにくいので、1つ考えられるのは、本当は提示のコードとは違うコードをコンパイルした結果を実行してしまっているのでは?ということです。そのへんを重点的に確認してみてください。
shuta_202141

2021/12/27 10:31

おかしいですね。時間は確かに違いますし%6や%8にした瞬間に乱数が変わってきます。%7にした瞬間に6しか生成されないです。一回時間をおいてみます。
ak.n

2021/12/27 10:56

・まず、真っ先にやることは、 time(NULL) の値が毎回変わっているか、確かめる。 time_t t = time(NULL); printf("%ld\n", t); ・次に、srand の引数が、正しく引き渡されているのかどうか・・   srand((unsigned)time(NULL))  としてみたらどうなる? 32bit と 64bit で違うとかあるようです。  時々、不思議な現象に遭遇しますが、必ず原因があります。
jimbe

2021/12/27 11:36

乱数なのですから、同じ値が何度出ても不思議では無いとも言えます。
shuta_202141

2021/12/27 12:19

ありがとうございます。
ak.n

2021/12/27 12:37

rand() の素の値は、毎回異なりますか? もし rand()の値は異なるのに rand() % 7 した結果が同じということであれば、rand() はシード値により値を変えているが 7 で割った余りが一致するような乱数が出力されている、としか考えられません。rand()の実装によっては、あり得ることですが、当方でコンパイルしてもそうはなりません・・・なんでしょうかね。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

C

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。