Python Numpy:循环中的随机数

问题描述 投票:1回答:3

我有这样的代码并使用Jupyter-Notebook

for j in range(timesteps):    
    a_int = np.random.randint(largest_number/2) # int version

我得到随机数,但当我尝试将部分代码移动到函数时,我开始在每次迭代中接收相同的数字

def create_train_data():        
    np.random.seed(seed=int(time.time()))     
    a_int = np.random.randint(largest_number/2) # int version
    return a

for j in range(timesteps):    
    c = create_train_data()  

为什么会发生这种情况以及如何解决?我想也许是因为Jupyter-Notebook中的过程

python numpy random
3个回答
3
投票

违规的代码行是

np.random.seed(seed=int(time.time()))

由于您在一个相当快速完成的循环中执行,因此在该时间调用int()会将随机种子减少到整个循环的相同数字。如果您真的想手动设置种子,以下是一种更强大的方法。

def create_train_data():   
    a_int = np.random.randint(largest_number/2) # int version
    return a

np.random.seed(seed=int(time.time()))
for j in range(timesteps):
    c = create_train_data()

注意种子如何被创建一次然后用于整个循环,这样每次调用随机整数时种子都会更改而不会被重置。

请注意,numpy已经处理了伪随机种子。你使用它并没有获得更多的随机结果。手动设置种子的常见原因是为了确保再现性。您将程序开头(笔记本顶部)的种子设置为某个固定整数(我在很多教程中看到42),然后所有计算都来自该种子。如果有人想验证你的结果,那么算法的随机性就不是一个混淆因素。


0
投票

其他答案是正确的,因为它是由于种子。如果你看看Documentation From SciPy,你会看到种子被用来创建一个可预测的随机序列。但是,我认为关于种子的另一个问题的以下答案可以更好地概述它的作用以及使用它的原因和位置。 What does numpy.random.seed(0) do?


-1
投票

如果你对伪随机数感到满意,Hans Musgrave的答案很棒。伪随机数对大多数应用程序都有好处,但如果用于加密则它们存在问题。

获取一个真正随机数的标准方法是在拉动数字之前使用系统时间为随机数生成器播种,就像您尝试过的那样。然而,正如汉斯·马斯格雷夫指出的那样,如果你把时间投入到int中,你会得到几秒钟的时间,这在整个循环中很可能是相同的。一段时间内种植RNG的正确解决方案是:

def create_train_data():        
    np.random.seed()     
    a_int = np.random.randint(largest_number/2) # int version
    return a

这是因为如果你没有将参数(或None)传递给np.random.seed,Numpy已经使用计算机时钟或种子的其他随机源:

参数:seed{None, int, array_like},可选用于初始化伪随机数生成器的随机种子。可以是02**32 - 1之间的任何整数,包括这样的整数的数组(或其他序列),或None(默认值)。如果seedNone,那么RandomState将尝试从/dev/urandom(或Windows模拟)中读取数据(如果可用)或从时钟播种。

这一切都取决于你的应用程序。请注意文档中的警告:

警告不应将此模块的伪随机生成器用于安全目的。有关安全性或加密用途,请参阅secrets模块。

© www.soinside.com 2019 - 2024. All rights reserved.