为什么numpy从同一个随机状态返回不同的随机数?

背心

重要修改:如果您有时间测试下面的代码段,请确保开始一个全新的会话或致电np.random.seed(None)一次。

背景:

我给人的印象是,诸如之类的函数np.random.randint()会为相同的随机状态(或您从中调用的输出np.random.get_state()绘制相同的一组数字

让我解释一下原因:

以下代码段用于np.random.randint()生成介于-10和10之间的5个随机整数,并存储有关该过程的一些信息。我称之为“状态”的是数组中的5个第一个数字,该数字存储在返回的元组的第二个元素中np.random.get_state()

片段1

# 1. Imports
import pandas as pd
import numpy as np

# 2. describe random state by
# retrieving the five first numbers
# in the array in the second element
# of the tuple returned by np.random.get_state()
randomState = np.random.get_state()
state = np.random.get_state()[1][:5]

# 3. generate random numbers
randints = np.random.randint(-10, 10, size = 5)

# 4. organize and present findings
df = pd.DataFrame.from_dict({'state':state, 'randints':randints})
print(df)

运行此代码一次,您将获得以下第一个输出部分中的结果。请注意,由于尚未设置随机种子,因此数字本身与我的数字会有所不同。重要的是三组输出的内部逻辑。如果您再运行一次相同的代码段,您会注意到我认为确实很奇怪的内容:

输出1:一些随机数和一个随机状态:

   randints       state
0       -10  2871458436
1         7  4226334938
2         1   179611462
3        -9  3145869243
4         5   317931933

到现在为止还挺好!我们有5个随机整数和5个数字表示随机状态。再次运行相同的代码段,您将获得如下内容:

输出2:新的随机数和新的随机状态:

   randints       state
0         1   727254058
1         7  1473793264
2         4  2934556005
3         1   721863250
4        -6  3873014002

现在,您似乎有了一个新的随机状态和5个新的随机数。如此看来,我的假设仍然成立。但是,每次我尝试过这种情况时,当您第三次运行相同的代码时,事情就会变得很奇怪。看看这个:

输出3:新的随机数和与以前相同的随机状态:

   randints       state
0         8   727254058
1        -4  1473793264
2        -1  2934556005
3       -10   721863250
4        -1  3873014002

如您所见,我的假设显然是错误的。什么是真正回事?

概要:

  1. 为什么np.random.randint()对于相同的随机状态返回不同的整数?
  2. 为什么运行此代码段在第一次运行和secon运行时会产生不同的随机状态,但是在第二次和第三次运行时却返回相同的随机状态?

感谢您的任何建议!

我的系统:

  • 的Python 3.6.0
  • IPython 5.1.0
  • 脾气暴躁的1.11.3
  • 间谍3.2.7
  • Windows 64

附录:

如果将相同的过程包装到一个函数中并运行两次以上,将会得到相同的结果。

片段2-与包含在函数中的片段1相同

def rnumbers(numbers, runs):

    df_out = pd.DataFrame()
    runs = np.arange(runs)

    for r in runs:

        print(r)

        state = np.random.get_state()[1][:numbers]

        # 4. generate random numbers
        randints = np.random.randint(-10, 10, size = numbers)

        # 5. organize and present findings
        df_temp = pd.DataFrame.from_dict({'state_'+str(r+1):state, 'randints_'+str(r+1):randints})

        df_out = pd.concat([df_out, df_temp], axis = 1)

    return df_out

df = rnumbers(10,3)
print(df)

输出:

   randints_1     state_1  randints_2     state_2  randints_3     state_3
0           4  3582151794          -5  1773875493           7  1773875493
1          -7  2910116392          -8  2402690106           3  2402690106
2          -8  3435011439           3  1330293688           4  1330293688
3           1   486242985           4   847834894           2   847834894
4          -3  4214584559           4  4209159694          -2  4209159694
5           4   752109368          -3  2673278965           1  2673278965
6         -10  3726578976           8  2475058425           4  2475058425
7           8  1510778984          -5  3758042425           0  3758042425
8          -2  4202558983          -5  2381317628           0  2381317628
9           4  1514856120           6  3177587154          -7  3177587154
汤玛士

因此,总结一下这个问题:随机状态的一部分的前5个数字有时是相同的,但是随机生成器的输出是不同的。

简短的答案是:随机状态确实会改变,但是您要查看的前5个数字保持不变。变化是在index处的数字2

for i in range(3):
    randomState = np.random.get_state()
    state = np.random.get_state()[2]
    randints = np.random.randint(-10, 10, size = 5)
    df = pd.DataFrame.from_dict({'state':state, 'randints':randints})
    print(df)

输出:

   randints  state
0        -9    624
1         6    624
2         4    624
3        -5    624
4         5    624
   randints  state
0        -9      5
1        -5      5
2         4      5
3        -4      5
4        -4      5
   randints  state
0         5     10
1        -8     10
2         8     10
3       -10     10
4        -3     10

Numpy使用Mersenne Twister算法,该算法每次以624为一组生成32位随机数。因此,我们可以预期大状态数组将保持不变,直到所有这些数字都被消耗掉并且需要再次调用Twister为止。

2状态索引处,它存储这些数量中已经消耗了多少。它始于624,因此Twister在生成任何输出之前在启动时运行一次。之后,您将看到列表保持不变,直到所有624个数字都被消耗掉为止。然后再次调用Twister,将计数器重置为0,然后整个过程重新开始。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在排序数组的第一个元素中得到一个随机数?

随机数生成器仅生成一个随机数

生成大于或小于前一个随机数的随机数

为什么“(seed * 9301 + 49297)%233280 / 233280.0”会生成一个随机数?

为什么两个绑定到同一个函数会返回不同的值

为什么同一个地址返回不同的值?

使用随机数时,如何始终选择一个不同的随机词组?

在同一个集合的不同属性上使用equals不会返回记录,为什么?

为什么numpy和random模块对同一种子给出不同的随机数?

为什么Docker容器名称的末尾会有一个随机数?

为什么即使种子相同,生成的随机数也不同?

如何在Swift中生成一个范围内的不同随机数?

为什么运行此代码时控制台在循环之前返回第一个随机数?

如何在Python中每次对同一个变量获取不同的随机数?

如果我们已经得到一个随机数组,为什么要使用随机快速排序?

尝试创建一个返回一些随机数的类

产生两个相同的随机数而另一个不同

使用php在一个范围内输出20个不同的随机数

当我遍历数组值时,它会打印一个随机数。为什么是这样?

为什么这个 javascript 函数为同一个查询返回两个不同的结果?

每次在同一个循环中使用时,如何使变量在 x 和 y 值之间具有不同的随机数?

为什么这个函数返回 0 而不是随机数

为什么elasticsearch 对不同索引的同一个查询返回的结果差别太大?

打印同一个数组,在不同的函数中是不同的,为什么呢?

如何从每个子集的概率不同的超集中选择一个随机数

为什么 MySQL View 和同一个 View 的底层 SELECT 查询返回不同的结果?

如何使用 numpy 创建一个非重复随机数矩阵,同时在这些随机数之间有一个范围?

Cucumber 不同场景下同一个随机类

为什么同一个指针的地址不同?