Python - random 模組用法筆記

從特定區間生成亂數

  • random.random() -> 在 0 <= x < 1.0 範圍中,生成一個 float。 (不含 1.0)
  • random.urandom(0, 100) -> 在 0 <= x <= 100 範圍中,生成一個 float。
  • random.randint(100, 200) -> 從 (100,101,102,...,200) 範圍中生成一個 int。

從序列中選出

給定一個序列 xs = [1.0, 1, 2, "Hello"]

  • random.choice(xs) -> 從 xs 中挑選一個
  • random.choice(range(0, 100, 3)) -> 從 (0,3,6,...,99) 中挑選出一個
  • random.randrange(0, 100, 3) -> 從 (0,3,6,...,99) 中挑選出一個 > 沒有實際的 range object 會被產生。
  • random.randrange(10) -> 從 (0,1,2,...,9) 中挑選出一個
  • random.sample(xs, k)
    • xs 中挑選 k 個且不會被重複挑中。
    • 直接回傳新的序列,不會影響傳入的 xs

序列操作

random.shuffle(xs) -> 將序列亂數排序。會改變 xs 狀態。

狀態初始化

random.seed(seed=None)

  • 預設為 None,會取 system time 當種子。
  • 同樣的種子保證同樣的亂數生成順序。

狀態存檔

  • random.setstate(state)
  • random.getstate()

獨立生成器

random.Random()

  • 全部的 methods 其實由背景的 random.Random() 的全域物件所提供。
  • 如果想要不想共享狀態,可以定義一個自有的 random.Random(),當成獨立的生成器。

加密安全的使用

以上所有亂數生成 methods 請用在加密安全上。
請改用 os.urandom() 或是 random.SystemRandom 這兩種 API,內部會呼叫由系統提供更高安全性的亂數產生器。去得到無法重現的亂數序列,來提高安全層級。

Reference: https://docs.python.org/3/library/random.html

comments powered by Disqus