
No.3ベストアンサー
- 回答日時:
http://ja.wikipedia.org/wiki/%E6%93%AC%E4%BC%BC% …
実行毎にバラバラにしたければ、srandで毎回変わるような値を種に設定する必要があります。
そのためには「実行の度に変化する値」を使う必要があります。
time関数を使えば、(実行時刻が1秒以上違えば)違う値になるので、よく種として使われます。
他に「実行の度に変化する値」があれば、そちらを使ってもいいです。(OS起動からの経過時間とか、マウスをグリグリ動かしてもらって、その軌跡から計算とか)
※ rand()は使えません。rand()がバラバラになるように指定するものですから。
time関数の仕様は、time関数のマニュアルを読みましょう。
以下の内容はマニュアルに明記されているか、容易に判断できることです。
(unsigned)で型変換しているのは、time関数の戻り値が time_t型であって、srandの引数が求めるunsinged int型では無いからです。
time_tが、符号無しだったり、intよりビット数が多かったりする可能性もあるので、「符号ビットをなくして表せる数を倍」ということではありません。
time関数の引数は time_t*型で、NULLで無い場合は、引数が示すポインタにも結果を返します。
time_t t;として
t=time(NULL);
と
time(&t);
とは同じ結果になります。なぜこんなことになっているか、は歴史的な事情です。
実行毎にバラバラにしたければ、srandで毎回変わるような値を種に設定する必要があります。
そのためには「実行の度に変化する値」を使う必要があります。
time関数を使えば、(実行時刻が1秒以上違えば)違う値になるので、よく種として使われます。
他に「実行の度に変化する値」があれば、そちらを使ってもいいです。(OS起動からの経過時間とか、マウスをグリグリ動かしてもらって、その軌跡から計算とか)
※ rand()は使えません。rand()がバラバラになるように指定するものですから。
time関数の仕様は、time関数のマニュアルを読みましょう。
以下の内容はマニュアルに明記されているか、容易に判断できることです。
(unsigned)で型変換しているのは、time関数の戻り値が time_t型であって、srandの引数が求めるunsinged int型では無いからです。
time_tが、符号無しだったり、intよりビット数が多かったりする可能性もあるので、「符号ビットをなくして表せる数を倍」ということではありません。
time関数の引数は time_t*型で、NULLで無い場合は、引数が示すポインタにも結果を返します。
time_t t;として
t=time(NULL);
と
time(&t);
とは同じ結果になります。なぜこんなことになっているか、は歴史的な事情です。
No.2
- 回答日時:
> srand((unsigned)time(NULL)というのを使いますが
> これはどういう意味を表してるんでしょうか?
srandのマニュアルを読みましょう。
http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=m …
randが作る乱数は疑似乱数といって、計算によってランダムに見える値を作り出すものです。
あらゆる疑似乱数にはその乱数の初期化に使う値 (seed) があり、同じseedを設定すると同じ乱数列が取り出せるようになっています。
srandはrand関数が作る関数のseedを設定する関数です。
現在時刻というのは常に変るので、常に違う乱数列を取り出したい場合に現在時刻をseedとして与えて乱数を作ります。
まぁ、今時srand(time(NULL))なんて、いい乱数列が必要なプログラムでは使わないですね。
randは線形合同法という方法で疑似乱数列を作る関数ですが、線形合同法は乱数のパターンに偏りがあることが知られていて、まともな数値シミュレーションでは使われなくなってきていると思います。そういう用途の場合、メルセンヌツイスター(以下、MTと略記)を使うのが普通でしょう。
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/ …
また、状況の再現性が大事になりますので、time(NULL)でとってきた適当な値で初期化なんてことは普通しないと思います。
セキュリティ用途で乱数を使うことも多いですが、その場合、アクセスする時刻から内部で使っている乱数seedを類推するのは簡単ですので、安全性としてはかなり弱いと言わざるを得ません。セキュリティ用途の場合、Unix系のシステムなら/dev/urandomから値を取るのが普通ですし、大量の乱数列がそこから必要な場合でも、/dev/urandomの値をseedとしてarc4randomなどを使うのが普通なのではないでしょうか。Windowsの場合でも、CryptGenRandom関数が用意されているはずです。
> NULLって何のために書いてあるのでしょうか?
timeのマニュアルを読みましょう。
http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=m …
NULLで無い場合はtime_t型変数へのポインタを渡し、その変数にtimeの返り値と同じ値が書き込まれます。
というわけで、マニュアルを読みましょう。
いい乱数列が必要な事例では、MTや/dev/urandomなどの使用を検討しましょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- 工学 疑似乱数生成器 3 2023/01/05 02:06
- 数学 以下の問題が分かりません。 8ビット浮動小数点数が、最上位ビットから順に符号1ビット、指数部3ビット 4 2023/07/22 16:06
- Excel(エクセル) Excelで睡眠時間をもとに判定したい 6 2022/08/19 13:47
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- PHP PHPで訪問回数を表示するカウンタを作成したい 3 2023/05/27 07:09
- 英語 英語で「5億年ぶりに〜した」みたいな表現はありますか? 4 2023/07/05 23:28
- 情報処理技術者・Microsoft認定資格 情報技術の問題についてです。 10進数の−36を以下のような16ビットの浮動小数点表示にするといくつ 3 2022/05/21 19:53
- Excel(エクセル) Excelでnullになるような式のセルをマクロで空白行と認識させるにはどうすればいいですか? 3 2023/03/13 13:42
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 exitの使い方
-
フォームを開くときに、コンボ...
-
Excel-vba 文字列と変数を...
-
C言語(DXlib)での音ゲーについ...
-
CGIのPerlの変数をJavaScrip...
-
C#でのIF文 時間比較のやり方
-
1つ前の値を変数に保存する方法
-
VBAで配列のNULL判定
-
疑似乱数の発生
-
計算機イプシロン
-
コンボボックスの名前を変数に...
-
GPIBの応答について
-
【C++/CLI】String型文字列の位...
-
Nullってどういう意味ですか?
-
ラジオボタンの値の取得につい...
-
VBAでダブルコーテーション入り...
-
エラーの意味は? Lvalue req...
-
COLUMN(1:1)の意味を教え...
-
excelの、ある数式内の{}の意...
-
プレゼント交換プログラム
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 exitの使い方
-
Excel-vba 文字列と変数を...
-
フォームを開くときに、コンボ...
-
数字の位ごとの値を表示するプ...
-
VB6.0-整数と余りを求める
-
足して100になるような乱数のア...
-
ラジオボタンの値の取得につい...
-
C#で動的にコントロールを取得...
-
VBAで配列のNULL判定
-
データ構造のmapとは?
-
関数で複数の値を戻り値として...
-
世界のナベアツ
-
VBA コンボボックスの値をスピ...
-
VBAの定数の使い方で、計算値を...
-
スピンボタンで小数点
-
1つ前の値を変数に保存する方法
-
Nullってどういう意味ですか?
-
コンボボックスの名前を変数に...
-
DWORDって
-
vbaで極大値を抽出する方法
おすすめ情報