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

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

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

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

Q&A

解決済

2回答

1165閲覧

rand()の初期値生成タイミングはいつですか?

achala

総合スコア27

C++

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

0グッド

0クリップ

投稿2018/09/27 07:16

C++の関数rand()は、
単体で用いるといつも同じ数字を返し、
srandと合わせて用いると実行する度に異なる数字を返しますが、
このような違いはなぜ生じるのでしょうか?

rand関数の乱数はある初期値を元に計算されますが、その初期値の設定のタイミングが異なるのでしょうか?

C++

1#include <iostream> 2#include <cstdlib> 3 4using namespace std; 5 6int main() 7{ 8 cout << rand() << endl; 9}

C++

1#include <iostream> 2#include <cstdlib> 3#include <ctime> 4 5using namespace std; 6 7int main() 8{ 9 srand((unsigned)time(0)); 10 cout << rand() << endl; 11}

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

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

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

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

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

guest

回答2

0

ベストアンサー

srandに与える引数に依って利用する疑似乱数列が定められます。
ですので、例えば srand(0) などとすればやはり同じ乱数列が生成されます。

srandを呼び出さずにrandを用いた場合、srand(1) の乱数列を用いるそうです。
実際に srand(1) を呼び出した結果と比較してみると良いでしょう。

void srand( unsigned seed );

Seeds the pseudo-random number generator used by std::rand() with the value seed.
If rand() is used before any calls to srand(), rand() behaves as if it was seeded with srand(1).
Each time rand() is seeded with the same seed, it must produce the same sequence of values.

引用元: cppreference.com > std::srand

srandの有無を超えて、シード値を毎回変えているかどうかの方が重要です。
シード値として時刻を与えているのは、実行ごとに別の値を使うための工夫でしかありません。

実験

srandを呼び出さない場合 Wandbox

1804289383 846930886 1681692777 1714636915 1957747793 424238335 719885386 1649760492 596516649 1189641421

srand(1)を与えた場合 Wandbox

1804289383 846930886 1681692777 1714636915 1957747793 424238335 719885386 1649760492 596516649 1189641421

実際に同じ結果になることが確認できます。

投稿2018/09/27 07:30

編集2018/09/27 07:37
LouiS0616

総合スコア35658

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

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

achala

2019/01/30 08:06

ありがとうございます。 具体的な例も出していただけ、理解出来ました。 また、お返事遅くなってしまい、大変申し訳ございませんでした。
guest

0

srandと合わせて用いると実行する度に異なる数字を返しますが、

srandで実行する度に別の引数を与えると異なる数字を返すし、srandで毎回同じ引数を与えると、毎回同じ数字を返します。

毎回同じ数字を返すのは、デバッグするときに、同じ現象が起こらないとデバッグできなくなるからです。

投稿2018/09/27 09:24

otn

総合スコア84423

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

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

achala

2019/01/30 08:07

回答有り難うございます。 同じ数字を返すのにはそんな理由があったんですね。 勉強になります。 回答遅くなってしまい、大変申し訳ございませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問