我正在try 改进我的NumPy随机数生成器,以模拟绘制n个随机数.然而,当我将推进n个数字后的位生成器的状态与简单地绘制n个数字后的状态进行比较时,结果在某一点之后有所不同.

我知道一些随机数字可能需要将状态前进多次,但我发现奇怪的是,前40-50个抽签数字的结果是匹配的,然后又出现分歧.

我try 使用Advance,因为有时我必须抽取随机数来保持重复相同的结果,尽管对于某些用例,我已经知道我不使用这些数字.在本例中,我想简单地(且快速地)推进随机数生成器,但确保绘制的所有数字保持不变.

我如何才能在确保可重复性的同时仍然使用高级等功能?

如果我使用从numpy开始的随机数生成器,我会比较每次前进10个增量与一次绘制相同数量的随机变量(standard_normal)时bit_generator的状态.经过几次迭代后,rng.bit_generator.state出现了分歧.我不知道为什么,因为我预计它会立即分开,或者永远不会分开.

rng = np.random.default_rng(2024)
s = rng.bit_generator.state

step = 10
num = 5

# Draw Random numbers using standard normal variable

rng.bit_generator.state = s

x = list()

for i in range(num):
    rng.standard_normal(step)
    x.append(rng.bit_generator.state['state']['state'])
    print('{i:3d} - {state:40d} {inc:40d}'.format(i=i, **rng.bit_generator.state['state']))

# Reset state and advance random number generator
rng.bit_generator.state = s

y = list()

for i in range(num):
    rng.bit_generator.state = rng.bit_generator.advance(step).state
    y.append(rng.bit_generator.state['state']['state'])
    print('{i:3d} - {state:40d} {inc:40d}'.format(i=i, **rng.bit_generator.state['state']))

对于我来说,输出是这样的.迭代2的结果不同,即状态不同.

  0 -  317319928805135160732659717497650841180  263843294879837360010514471918415607657
  1 -  152261761237047187080279356346465986730  263843294879837360010514471918415607657
  2 -   12941317612297752247903241541248335614  263843294879837360010514471918415607657
  3 -  167375039976652124381293896870728401724  263843294879837360010514471918415607657
  4 -   78535979019656695810700673044059278986  263843294879837360010514471918415607657

  0 -  317319928805135160732659717497650841180  263843294879837360010514471918415607657
  1 -  152261761237047187080279356346465986730  263843294879837360010514471918415607657
  2 -  262244773524709030991986015855808125320  263843294879837360010514471918415607657
  3 -  174718512225906865463277455530823048310  263843294879837360010514471918415607657
  4 -  213819718814773627130094102456555149556  263843294879837360010514471918415607657

推荐答案

为什么要假设advance等同于生成一个给定类型的样本>;

In [715]: rng=np.random.default_rng()

In [716]: timeit rng.bit_generator.advance(1000)
2.66 µs ± 5.72 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)

Uniform和Normal使用不同的时间,表示它们的生成方式不同:

In [717]: timeit rng.random(1000)
10.2 µs ± 9.81 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)

In [718]: timeit rng.standard_normal(1000)
19.3 µs ± 41.7 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

advance个doctor 说:

Advancing a RNG updates the underlying RNG state as-if a given
number of calls to the underlying RNG have been made. In general
there is not a one-to-one relationship between the number output
random values from a particular distribution and the number of
draws from the core RNG.  

uniform是更简单的分布,花费的时间更少,并且更有可能与advance有一对一的关系:

In [727]: rng = np.random.default_rng(2024)
     ...: s = rng.bit_generator.state
    
In [728]: rng.bit_generator.state = s
     ...: for i in range(5):
     ...:     rng.bit_generator.state = rng.bit_generator.advance(10).state
     ...:     print('{i:3d} - {state:40d} {inc:40d}'.format(i=i, **rng.bit_generator.state['state']))
     ...:     
  0 -  317319928805135160732659717497650841180  263843294879837360010514471918415607657
  1 -  152261761237047187080279356346465986730  263843294879837360010514471918415607657
  2 -  262244773524709030991986015855808125320  263843294879837360010514471918415607657
  3 -  174718512225906865463277455530823048310  263843294879837360010514471918415607657
  4 -  213819718814773627130094102456555149556  263843294879837360010514471918415607657

In [730]: rng.bit_generator.state = s
     ...: for i in range(5):
     ...:     rng.standard_normal(10)
     ...:     print('{i:3d} - {state:40d} {inc:40d}'.format(i=i, **rng.bit_generator.state['state']))
     ...:     
  0 -  317319928805135160732659717497650841180  263843294879837360010514471918415607657
  1 -  152261761237047187080279356346465986730  263843294879837360010514471918415607657
  2 -   12941317612297752247903241541248335614  263843294879837360010514471918415607657
  3 -  167375039976652124381293896870728401724  263843294879837360010514471918415607657
  4 -   78535979019656695810700673044059278986  263843294879837360010514471918415607657

In [731]: rng.bit_generator.state = s
     ...: for i in range(5):
     ...:     rng.random(10)
     ...:     print('{i:3d} - {state:40d} {inc:40d}'.format(i=i, **rng.bit_generator.state['state']))
     ...:     
  0 -  317319928805135160732659717497650841180  263843294879837360010514471918415607657
  1 -  152261761237047187080279356346465986730  263843294879837360010514471918415607657
  2 -  262244773524709030991986015855808125320  263843294879837360010514471918415607657
  3 -  174718512225906865463277455530823048310  263843294879837360010514471918415607657
  4 -  213819718814773627130094102456555149556  263843294879837360010514471918415607657

ramdomadvance匹配,standard_normal不匹配.

Python相关问答推荐

云上Gunicorn的Flask-socketIO无法工作

机器人与Pyton Minecraft服务器状态不和

Python panda拆分列保持连续多行

通过优化空间在Python中的饼图中添加标签

如何使用pandasDataFrames和scipy高度优化相关性计算

如何在箱形图中添加绘制线的传奇?

将jit与numpy linSpace函数一起使用时出错

用合并列替换现有列并重命名

在Python argparse包中添加formatter_class MetavarTypeHelpFormatter时, - help不再工作""""

优化器的运行顺序影响PyTorch中的预测

NumPy中条件嵌套for循环的向量化

用渐近模计算含符号的矩阵乘法

在两极中过滤

手动设置seborn/matplotlib散点图连续变量图例中显示的值

matplotlib图中的复杂箭头形状

python—telegraph—bot send_voice发送空文件

在Python中使用yaml渲染(多行字符串)

为什么'if x is None:pass'比'x is None'单独使用更快?

Polars Group by描述扩展

从源代码显示不同的输出(机器学习)(Python)