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

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

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

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

Q&A

解決済

2回答

2464閲覧

time関数を使った乱数発生

hiky

総合スコア24

C

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

0グッド

2クリップ

投稿2017/08/27 07:30

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

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

c

1コード 2#include <stdio.h> 3#include <stdlib.h> 4#include <time.h> 5 6int main(void){ 7 double x; /* 乱数を代入するための変数 */ 8 int i; /* for文で使う */ 9 time_t timer; 10 11 for(i = 0; i < 2; i++){ 12 timer = time(NULL); /* 現在の時間 */ 13 srand(timer); /* 種を変更 for文が繰り返されるごとに数値が変わることを期待*/ 14 x = (double)rand() / RAND_MAX; 15 printf("%f", x); 16 } 17 return 0; 18} 19 20 21 22 23```c 24コード

#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;

}

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

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

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

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

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

guest

回答2

0

ベストアンサー

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

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

srand( seed );

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

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

投稿2017/08/27 07:47

Marbow

総合スコア55

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

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

majiponi

2017/08/27 15:08

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

0

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

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

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

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

注意すべきは、

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

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

投稿2017/08/28 00:35

ttyp03

総合スコア16996

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問