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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

3回答

2140閲覧

Pythonにおける乱数の種

hamberger

総合スコア24

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/07/30 13:06

Pythonで乱数を取得するとき、seed値の上限はあるのでしょうか。
pythonでは、デフォルトでシステム時刻からseed値を取得しているようですが、
以下のようなコードで正規乱数を取得する際、システム時刻から得たseed値は一度も重複しないのかどうか気になりました。
ドキュメントを見てもいまいちわからなかったので、詳しい方宜しくお願いいたします。
特にxが非常に大きいとき(10^9以上)を想定していただきたいです。

python

1import numpy as np 2for i in range(0,x): # xは非常に大きいとする 3 np.random.normal(0,1) # 平均0, 分散1の正規乱数を生成(seed値を指定しない場合システム時刻より取得)

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

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

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

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

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

guest

回答3

0

ベストアンサー

numpy.random.seed — NumPy v1.15 Manual

Must be convertible to 32 bit unsigned integers.

と書いてあるので、uint32 の範囲 (0~4294967295) の値であれば、指定できると思います。

ソースを見るとたしかに uint32_t 型で受け取るようになっていますね。

numpy/_mt19937.pyx at 77410e26dd94bdd07df096be06ee9aa7d5738ce6 · numpy/numpy

追記

疑似乱数列の長さが N だとしたら、乱数を生成するたびに、疑似乱数列の先頭から乱数を取り出していくというイメージです。

python

1import numpy as np 2 3np.random.seed(1) 4for i in range(4): 5 print(np.random.rand()) 6print("----") 7 8np.random.seed(1) 9print(*np.random.rand(4), sep="\n") 10print("----") 11 12 13np.random.seed(1) 14for i in range(2): 15 print(*np.random.rand(2), sep="\n")
0.417022004702574 0.7203244934421581 0.00011437481734488664 0.30233257263183977 ---- 0.417022004702574 0.7203244934421581 0.00011437481734488664 0.30233257263183977 ---- 0.417022004702574 0.7203244934421581 0.00011437481734488664 0.30233257263183977

投稿2020/07/30 13:18

編集2020/07/31 04:39
tiitoi

総合スコア21956

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

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

hamberger

2020/07/30 15:22

ご回答ありがとうございます。 unit32の範囲を超えたループが必要になりそうなので、ループ内での生成は諦めるしかなさそうです。 unit32の範囲以上の乱数を生成しなければならない場合には、ループの外であるシードのもとで一気に生成すれば、品質の良い正規乱数の巨大な配列を得ることができると思いますが、メモリ不足への対処法はありますでしょうか。モンテカルロ法など、非常に収束の悪い計算でどうしてもたくさんの乱数が必要です。
tiitoi

2020/07/31 01:26

乱数シードについてなにか勘違いされていませんか?乱数シードは擬似乱数列を規定するものであって、再現性を確保したい場合などにプログラムの最初に1回だけ設定すればよいです。 ループで1個ずつ生成するか、一度にたくさん生成するかで乱数のシードは関係ないです。メルセンヌツイスタは周期が約 10^6001 なので、周期問題は気にせず、乱数がほしいときに必要な数だけ乱数を作るコードを書けばよいです。
hamberger

2020/07/31 02:32

ということは、上で私が質問したコードでは、一回目の呼び出しでシステム時刻からseed値が確保され、次のループからはあくまで同じseedのもとで異なる乱数が生成され続けているということでよろしいでしょうか。
tiitoi

2020/07/31 04:28 編集

はい、print して確認してみてください
hamberger

2020/07/31 06:00

確かめました。長い間ありがとうございました!
guest

0

Pythonで乱数を取得するとき、seed値の上限はあるのでしょうか。

標準のrandomモジュールであればs there a maximum character limit to random seed?にそのままの回答がありました。
2000bitで切り捨てられるそうなので、その範囲で同値になる値を与えれば、結果的に同じseed値を与えたことになるようです。

投稿2020/07/30 13:17

can110

総合スコア38341

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

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

0

システム時刻が同一ならば当然同一となりますよ

投稿2020/07/30 13:10

y_waiwai

総合スコア88042

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問