簡體   English   中英

在 python 中生成真隨機數

[英]Generate true random numbers in python

Python function 生成真正的隨機數?

通過真正的隨機數,這也意味着每次我運行 python 我生成的種子都是不同的。 我該怎么做呢?

Python 沒有任何東西可以讓您生成“真正隨機”的數字,因為它們是均勻分布的並且獨立於其他所有東西(尤其是后者)。

在任何情況下,“偽隨機”和“真正隨機”數字之間的區別並不是應用程序關心的(並且您沒有真正指定您想到的應用程序類型)。 相反,一般來說:

  • 安全應用程序關心數字是否難以猜測; 在這種情況下,只有加密 RNG 才能滿足這一要求(即使是依賴於偽隨機數生成器的)。 Python 示例是secrets模塊或random.SystemRandom
  • 科學模擬關心這些數字的行為是否像獨立的均勻隨機數,並且通常關心這些數字在以后是否可重現。 Python 示例是numpy.random.Generatorrandom.Random

另請參閱以下問題:

生成隨機數的方法有很多種,只有一個共同點——它們都需要外部輸入。 假設您使用像游戲一樣的簡單 RNG。 RNG 接受一個輸入(通常是系統時間,以秒或毫秒為單位),並執行各種不穩定的數學運算來產生一個看起來隨機的輸出。

但是,假設您的計算機具有可以測量大氣噪聲的硬件 - 您可以使用任何筆記本電腦上的內置麥克風或台式機上的外部麥克風輕松地做到這一點......或者您可以測量噪音的隨機性用戶的輸入——眾所周知,人類是熵的良好來源……或者你可以測量亞原子粒子的衰變——量子力學是隨機的。

如果你可以做任何這些事情 - 你實際上可以做所有這些(#3 需要特殊的硬件),你可以通過加密哈希(例如 SHA-256)來創建一個真正隨機的字節流等概率對於每一個可能的狀態。 如果您使用 SHA-256,如果您想要盡可能多的隨機性,最好對至少 512 位(64 字節)的數據進行散列。

此外,大多數現代系統在其 CPU 中內置了 TRNG(真隨機數生成器); 硬件制造商開始這樣做是為了滿足密碼學中對更好的 RNG 的需求。 因此,如果可用(使用 python secrets模塊),許多系統將默認為 TRNG。

您可以通過運行cat /dev/random輕松檢查 Linux 上是否有 TRNG。 如果它在幾秒鍾后停止並等待,則您不需要並且需要使用另一種技術。 如果 if 繼續與/dev/urandom相同,則您已經有一個 TRNG 並且可以輕松制作真正的隨機數!

更新:可以在此處找到 Python secrets模塊文檔。 一個快速的示例程序:

import secrets
low = 10
high = 100
out = secrets.randbelow(high - low) + low # out = random number from range [low, high)
print(out) # Print your number

您還可以使用secrets直接創建十六進制字符串,或生成隨機字節流。 您可以查看其文檔以了解更多信息。

有一種東西叫做真隨機數。
查看: www.random.org了解更多信息。
代碼示例:

import requests
source = "https://www.random.org/integers/?num=1&min=1&max=100&col=5&base=10&format=plain&rnd=new"
number = requests.get(source)
number = int(number.text)

這將為您提供所需的一切+如何設置它以及如何根據時間獲取新種子:

def get_truly_random_seed_through_os(rand_size: int = 4) -> int:
    """
    Usually the best random sample you could get in any programming language is generated through the operating system. 
    In Python, you can use the os module.

    source: https://stackoverflow.com/questions/57416925/best-practices-for-generating-a-random-seeds-to-seed-pytorch/57416967#57416967
    """
    random_data = os.urandom(
        rand_size
    )  # Return a string of size random bytes suitable for cryptographic use.
    random_seed: int = int.from_bytes(random_data, byteorder="big")
    return int(random_seed)


def get_different_pseudo_random_seed_every_time_using_time() -> int:
    """ Get a different pseudo random seed every time using time."""
    import random
    import time

    # random.seed(int(time.time()))
    seed: int = int(time.time())
    return seed


def seed_everything(seed: int,
                    seed_torch: bool = True,
                    ):
    """
    https://stackoverflow.com/questions/57416925/best-practices-for-generating-a-random-seeds-to-seed-pytorch
    """
    import random
    import numpy as np
    import os

    random.seed(seed)
    np.random.seed(seed)
    os.environ["PYTHONHASHSEED"] = str(seed)
    if seed_torch:
        import torch
        torch.manual_seed(seed)
        # makes convs deterministic: https://stackoverflow.com/a/66647424/1601580, torch.backends.cudnn.deterministic=True only applies to CUDA convolution operations, and nothing else. Therefore, no, it will not guarantee that your training process is deterministic
        torch.backends.cudnn.deterministic = True
        torch.backends.cudnn.benchmark = False
        # #torch.use_deterministic_algorithms(True) # do not uncomment
        # fully_deterministic: bool = uutils.torch_uu.make_code_deterministic(args.seed)

如前所述,這是一個很好的資源: Can I generate authentic random number with python?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM