有没有一种有效的方法可以在numpy数组中创建N个伯努利试验的二项式实验



假设我有一枚硬币,它以概率p落在头上。要进行的实验是继续翻转硬币x次。这个实验要重复1000次。

问题是否有一种有效/矢量化的方法来生成随机1(概率为p(和0(概率为1-p(的数组?

如果我尝试这样的东西:

np.full(10,rng().choice((0,1),p= [.3,.7]))

整个数组都填充了相同的选择。我见过一些解决方案,其中包括固定的0与1的比率。

a = np.ones(n+m)
a[:m] = 0
np.random.shuffle(a) 

然而,我不确定如何用这种设置来保持实验的随机性。

目前,我只是按如下方式循环每个迭代,但一旦实验数量变大,它就会非常慢。

(实际的实验涉及当两个连续的磁头翻转时终止每个试验,这就是为什么代码中有一个while循环。为了使问题具体化,我不想在这里解决这个问题。(

Set = [0,1]
T = np.ones(Episodes)
for i in range(Episodes):
a = rng().choice(Set, p=[(1 - p), p])
counter = 1
while True:
b = rng().choice(Set, p=[(1-p),p])
counter += 1
if (a == 1) & (b == 1):
break
a = b
T[i] = counter

任何见解都将不胜感激,谢谢!

以上评论中列出的@Quang Hong和@Kevin提供的答案。只是用default_rng((转发,这样以后更容易引用。但他们才是这里真正的英雄。

from numpy import default_rng as rng 
rng().binomial(1, p = .7, size=(10,10))
rng().choice((0,1),p = [.3,.7], size=(10,10))

最新更新