- 締切済み
乱数の初期化
乱数の初期化を行うときに、時間以外の方法で初期化できないものでしょうか?
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- mac_res
- ベストアンサー率36% (568/1571)
時間を使わない理由が不明なので自信が待てませんが、rand_r(3)を用いて、プログラム終了時のseedpをdisk fileに保存し、再起動時には保存したseedpを使うことにより、同系列の乱数を使い続けるのはいかがでしょうか? 実質上このプログラムが最初に起動してから、rand_r()を呼んだ通算総数をseedとして使うことになります。 何らかの原因で、seedpを保存する前に強制終了してしまうと次回、前回と同じ乱数を発生してしまいますが。
- neKo_deux
- ベストアンサー率44% (5541/12319)
> 申し訳ないですが、時間でする方法での解決は望みません。 > 仕様上の問題ですので。 時間でしない「理由」を補足しては? 初回か処理が毎回きっかり同じ時刻に実施されるので、乱数にならないとか? システムで時計を持っていないとか? -- > 環境は、コンシューマー器機になります。 何のコンシューマーか不明瞭ですが、昔からある方法としては、ユーザーの操作は毎回違うタイミングであると考えられるので、 「STARTボタンを押してください。」 みたいなものを表示しながら高速に数字をカウントしておき、ボタン操作の際のカウントで乱数初期化とか。 ただし、この方法は実際問題として、時間を使うのと同等です。 コンピュータの閉じた世界ですと、本当にランダムなものってほとんど無いです。 ・精度的に難がありそうですが、起動時のCPUの温度(毎回異なる室温に依存するはず。) ・毎回ログなどのデータを記録するのなら、ディスクの容量。 ・マイク入力で周囲の音を拾って。 とか?
- noboru2000
- ベストアンサー率33% (47/140)
昔のマイコンとかではメモリを読むというのがありました。電源を入れた直後はRAMの状態が不定値なのでそこから何バイトか読んで初期値にするんです。(しかしこの頃のメジャーなOSではこれは使えないかも知れません。プログラム起動時にOSが0クリアしてるかも知れないから)。 あとは人間が何らかの操作をする機械の場合はそれを乱数の種に使えると思います。たとえば電源を入れてから何かのボタンを人が押すのであれば電源を入れた直後(というかリセットが掛かった直後)からカウンタを動かし、ボタンが押されたらカウンタをストップしてその値を使うとか。 その他、色々なI/Oの内ランダムになっていそうなものを利用するというのもあります。たとえばネットワークインターフェースがある機械で、ネットワークに接続した状態で動くというのであれば電源を入れてから最初のネットワークのパケットが来るまでをカウントするとか、内容を何バイトか拾ってその値を利用するとかね。(但し常に同じパケットが同じタイミングでしか来ない場合はこれは使えません)。
環境と質問の背景を補足してください。 組み込みシステムで時間(時刻)が使えないとか, 時間(時刻)で初期化してみたらうまくいかなかったとか。
- ymmasayan
- ベストアンサー率30% (2593/8599)
他にも無いわけではありません。 例えば核分裂のゆらぎを使うとか、電気的な熱雑音の分布を使うとか。 でも一番手っ取り早いのは時間でしょう。
補足
申し訳ないですが、時間でする方法での解決は望みません。 仕様上の問題ですので。 環境は、コンシューマー器機になります。(詳しくはいえませんが。) 実行を行う器機は必ず同じもので、C言語標準とお考えください。