重要修改:如果您有时间测试下面的代码段,请确保开始一个全新的会话或致电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
如您所见,我的假设显然是错误的。什么是真正回事?
概要:
np.random.randint()
对于相同的随机状态返回不同的整数?感谢您的任何建议!
我的系统:
附录:
如果将相同的过程包装到一个函数中并运行两次以上,将会得到相同的结果。
片段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] 删除。
我来说两句