1

简单的测试代码:

pop = numpy.arange(20)
rng = numpy.random.default_rng(1)
rng.choice(pop,p=numpy.repeat(1/len(pop),len(pop))) # yields 10
rng = numpy.random.default_rng(1)
rng.choice(pop) # yields 9

numpy 文档说:

与 a 中的每个条目相关联的概率。如果没有给出样本,则假设 a 中所有条目的分布是均匀的。

我不知道创建统一分布的任何其他方式,但是numpy.repeat(1/len(pop),len(pop)).

numpy 是否在使用其他东西?为什么?

如果不是,设置分布如何影响种子?

分发和种子不应该是独立的吗?

我在这里想念什么?

4

2 回答 2

0

使用 numpy 创建均匀分布的更惯用的方法是:

numpy.random.uniform(low=0.0, high=1.0, size=None)

或者在你的情况下 numpy.random.uniform(low=0.0, high=20.0, size=1)

或者,你可以简单地做

rng = numpy.random.default_rng(1)
rng.uniform()*20

至于您关于为什么调用 rnd.choice 的两种方法会导致不同输出的问题,我的猜测是解释器执行它们的方式略有不同,因此,尽管您从相同的随机初始化开始,但到随机变量调用被执行时,你在不同的随机元素中两次调用并得到不同的结果。

于 2020-06-23T14:00:04.547 回答
0

分布不影响种子。详情如下:

我检查了源代码: numpy/random/_generator.pyx#L669

如果p给出,它将rng.random用于获取随机值:

import numpy

pop = numpy.arange(20)
seed = 1
rng = numpy.random.default_rng(seed)

# rng.choice works like bellow
rand = rng.random()
p = numpy.repeat(1/len(pop),len(pop))
cdf = p.cumsum()
cdf /= cdf[-1]
uniform_samples = rand
idx = cdf.searchsorted(uniform_samples, side='right')
idx = numpy.array(idx, copy=False, dtype=numpy.int64) # yields 10
print(idx)

# -----------------------
rng = numpy.random.default_rng(seed)
idx = rng.choice(pop,p=numpy.repeat(1/len(pop),len(pop))) # same as above
print(idx)

如果p没有给出,它将rng.integers用来获取一个随机值:

rng = numpy.random.default_rng(seed)
idx = rng.integers(0, pop.shape[0]) # yields 9
print(idx)
# -----------------------
rng = numpy.random.default_rng(seed)
idx = rng.choice(pop) # same as above
print(idx)

seed您可以使用不同的值进行玩耍。我不知道 and 会发生什么rng.randomrng.integers但你可以看到它们的行为不同。这就是为什么你得到不同的结果。

于 2020-06-23T16:11:27.237 回答