代码之家  ›  专栏  ›  技术社区  ›  ivanleoncz velhala

Python是否随机。seed()和numpy.random。seed()实现各不相同?

  •  0
  • ivanleoncz velhala  · 技术社区  · 6 年前

    这是我的代码:

    from numpy.random import seed
    from numpy.random import randint
    from numpy import mean
    import matplotlib.pyplot as plt
    import random
    
    # [With Numpy]
    #
    # Generate 1000 samples of 50 men, from 60 to 90 Kilos and calculate the mean
    # of each sample, at once.
    seed(1)
    means = [mean(randint(60, 90, 50)) for _i in range(1000)]
    
    # [Without Numpy]
    #
    # Generate 1000 samples of 50 men, from 60 to 90 Kilos.
    # Calculate the mean of each sample, storing on a separated list.
    random.seed(1)
    samples = list()
    for i in range(0, 1000):
        samples.append([random.randint(60, 90) for n in range(50)])
    means_without_numpy = [sum(s) / len(s) for s in samples]
    
    # Plot distributions of sample means, side by side.
    plt.subplot(1, 2, 1)
    plt.title("Numpy")
    plt.hist(means)
    plt.subplot(1, 2, 2)
    plt.title("Pure Python")
    plt.hist(means_without_numpy)
    plt.show()
    
    print(f"The mean of means:                 {mean(means)}")
    print(f"The mean of means (without numpy): {mean(means_without_numpy)}")   
    

    此代码在关闭后生成以下直方图和消息:

    enter image description here

    $ python3 clt_comparisson.py 
    The mean of means:                74.54001999999998
    The mean of means (without numpy): 74.94394
    

    1. random numpy
    2. 如果第一个问题是真的:既然如此,我提供 1
    0 回复  |  直到 6 年前
        1
  •  1
  •   tdelaney    6 年前

    numpy random 使用不同的算法,我认为这对于用C和fortran编写的数学软件包来说是很正常的。具有相同种子的相同算法将产生相同的值

    >>> import random
    >>> random.seed(12345678)
    >>> import numpy.random
    >>> numpy.random.seed(12345678)
    >>> random.randint(0, 100000)
    94406
    >>> numpy.random.randint(0, 100000)
    67251
    

    (不一样)

    即使在很大的范围内,两种实现之间的分布也会略有不同,因为您不会期望它们之间的随机性质量完全相等。如果在同一程序中创建第二个数据集而不更改种子,则它会有所不同,具有不同种子的数据集也会有所不同。

    在加密环境中,人们不会提供自己的种子,但在科学方面,如果你想要一个模型是可复制的,它可能是有用的。在这种情况下,您的代码基于 numpy.random.RandState numpy.random.seed() 其他人可能需要或可以改变。

    推荐文章