Python Numpy:循环中的随机数

时间:2018-09-18 16:09:57

标签: python numpy random

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

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()  

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

git

为什么会发生以及如何解决?我认为可能是因为Jupyter-Notebook中的过程

3 个答案:

答案 0 :(得分:3)

令人反感的代码行是

df1['Helpkey']=df1.groupby('id').cumcount()
df2['Helpkey']=df2.groupby('id').cumcount()

df1.merge(df2,how='left').drop('Helpkey',1)

由于您正在快速完成的循环中执行,因此按时间调用np.random.seed(seed=int(time.time())) 可将整个循环的随机种子数减少为相同的数量。如果您真的想手动设置种子,则以下方法更可靠。

int()

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

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

答案 1 :(得分:0)

其他答案是正确的,说这是因为种子。如果查看Documentation From SciPy,您会发现种子用于创建可预测的随机序列。但是,我认为从另一个有关种子的问题得到的以下回答可以更好地概述其作用以及使用原因/用途。 What does numpy.random.seed(0) do?

答案 2 :(得分:-1)

如果您对伪随机数感到满意,那么Hans Musgrave的答案就很好。伪随机数对大多数应用程序都很好,但是如果用于密码学,它们会出现问题。

获取一个真正的随机数的标准方法是在拉取该数字之前,先用系统时间为随机数生成器播种,就像您尝试过的那样。但是,正如汉斯·马斯格雷夫(Hans Musgrave)所指出的那样,如果将时间转换为整数,则以秒为单位的时间将很可能在整个循环中都是相同的。带时间播种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)读取数据   类似)(如果有的话),或者从时钟播种。

这完全取决于您的应用程序。请注意文档中的警告:

  

警告不应使用此模块的伪随机数生成器   为了安全起见。有关安全性或加密用途,请参阅   机密模块。