python random设置种子_关于python:如何查询random.random()使用的种子?
有沒有辦法找出python用來給隨機數生成器種子的種子是什么?
我知道我可以指定我自己的種子,但是我很滿意Python管理它。但是,我確實想知道它使用了什么種子,這樣如果我喜歡在特定運行中得到的結果,我可以稍后復制該運行。如果我有使用過的種子,我可以。
如果答案是我做不到,那我自己種下種子的最好方法是什么?我想讓他們從一個跑步到另一個跑步,我只想知道使用了什么。
更新:是的,我的意思是隨機。隨機()!錯誤…[更新標題]
什么是math.random()?你是說random.random()嗎?
因為要把原始種子取回來并不容易,所以我只需要自己從操作系統(tǒng)中生成一個,例如seed = int.from_bytes(os.urandom(8), byteorder="big")。
無法從發(fā)電機中取出自動種子。我通常會產生這樣的種子:
seed = random.randrange(sys.maxsize)
rng = random.Random(seed)
print("Seed was:", seed)
這樣,它是基于時間的,所以每次運行腳本(手動)時都會有所不同,但是如果使用多個生成器,它們將不會有相同的種子,因為它們幾乎是同時創(chuàng)建的。
默認情況下,prng是從操作系統(tǒng)的prng中自動播種的(通過os.urandom),因此這幾乎總是不必要的。
@格倫·梅納德,除非你想知道種子是什么樣的,這樣你以后就能復制產生的序列。
Python缺乏EDOCX1,1,但這比在爪哇相當痛苦。
在python3+中,使用sys.maxsize,因為已刪除sys.maxint
你的播種方式與:seed = ord(os.urandom(1))相比如何?
@Brendanmaguire你在說什么,你可以使用sys.maxsize,據我在python中所說,Python 3.6.3 |Anaconda custom (64-bit)| (default, Nov 3 2017, 19:19:16)可以使用sys.maxsize 9223372036854775807。
@查理帕克,我在看到布蘭登的評論后更新了我的答案,這就是為什么答案中說是maxsize。以前用過maxint。
隨機數生成器的狀態(tài)并不總是簡單的種子。例如,安全prng通常有一個熵緩沖區(qū),這是一個更大的數據塊。
但是,您可以保存和恢復Randon數字生成器的整個狀態(tài),以便稍后可以復制其結果:
import random
old_state = random.getstate()
print random.random()
random.setstate(old_state)
print random.random()
# You can also restore the state into your own instance of the PRNG, to avoid
# thread-safety issues from using the default, global instance.
prng = random.Random()
prng.setstate(old_state)
print prng.random()
號
當然,如果你想持續(xù)保存,那么getstate的結果可以被腌制。
http://docs.python.org/library/random.html random.getstate
這不會重現一個序列,只會讓你從上次停止的地方繼續(xù)。如果您想從一開始就復制整個序列,您需要知道seed值。
@祖巴:這些是等效的。要從tart復制整個序列,只需在該點存儲prng的狀態(tài)。
考慮到問題的上下文(可選的每次運行種子設定),存儲相對較大的狀態(tài)元組遠不是最佳的。單個種子值更容易嵌入到配置數據中,如果需要安全的prng,則無論如何都不應該保存種子(或狀態(tài))。
這在技術上是正確的,但Zooba的方法對于OP的目的來說更加用戶友好。
@他的方法不必要地缺乏安全感,大大減少了隨機性。(不應該存儲安全prng的狀態(tài)的想法是胡說八道的——你也可以說不應該存儲https服務器的私鑰。)
@格倫:哦,好的。當時我的評論是錯誤的。
您可以將random.random子類化,以與python相同的方式重寫seed()方法(在本例中為v3.5),但在調用super()之前將seed值存儲在變量中:
import random
class Random(random.Random):
def seed(self, a=None, version=2):
from os import urandom as _urandom
from hashlib import sha512 as _sha512
if a is None:
try:
# Seed with enough bytes to span the 19937 bit
# state space for the Mersenne Twister
a = int.from_bytes(_urandom(2500), 'big')
except NotImplementedError:
import time
a = int(time.time() * 256) # use fractional seconds
if version == 2:
if isinstance(a, (str, bytes, bytearray)):
if isinstance(a, str):
a = a.encode()
a += _sha512(a).digest()
a = int.from_bytes(a, 'big')
self._current_seed = a
super().seed(a)
def get_seed(self):
return self._current_seed
。
如果對其進行測試,則使用新種子生成的第一個隨機值和使用相同種子生成的第二個隨機值(使用我們創(chuàng)建的get_seed()方法)將相等:
>>> rnd1 = Random()
>>> seed = rnd1.get_seed()
>>> v1 = rnd1.randint(1, 0x260)
>>> rnd2 = Random(seed)
>>> v2 = rnd2.randint(1, 0x260)
>>> v1 == v2
True
如果您存儲/復制巨大的種子值并嘗試在另一個會話中使用它,則生成的值將完全相同。
沒有多少人欣賞這種方法。這個解釋太離譜了。
如果使用random.seed(None)來"設置"種子,隨機化器將自動作為系統(tǒng)時間的函數進行種子設定。但是,正如您觀察到的,您不能訪問這個值。當我想隨機化但仍然知道種子是這樣的時候,我要做的是:
tim = datetime.datetime.now()
randseed = tim.hour*10000+tim.minute*100+tim.second
random.seed(randseed)
。
注:我之所以喜歡使用@abdallah提出的time.time(),是因為通過這種方式,randseed具有人類可讀性和可立即理解性,這通常有很大的好處。還可以根據需要添加日期組件甚至微段。
我也想做同樣的事,但我得不到種子。所以,我想,因為種子是由時間產生的。我使用系統(tǒng)時間創(chuàng)建了我的種子,并將其用作種子,所以現在我知道使用了哪個種子。
SEED = int(time.time())
random.seed(SEED)
由于沒有人提到,在任何編程語言中通常可以獲得的最佳隨機樣本是通過操作系統(tǒng)生成的,因此我必須提供以下代碼:
random_data = os.urandom(8)
seed = int.from_bytes(random_data, byteorder="big")
。
這在密碼學上是安全的。
總結
以上是生活随笔為你收集整理的python random设置种子_关于python:如何查询random.random()使用的种子?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 服务器安装固态硬盘的步骤,服务器系统安装
- 下一篇: lisp 车位块自动编号_机械车位做产权