Python 如何在numpy中对硬币分配进行矢量化模拟?

Python 如何在numpy中对硬币分配进行矢量化模拟?,python,numpy,vectorization,Python,Numpy,Vectorization,我有以下问题,这是一个重新设计的家庭作业问题,我希望在即将到来的教程中加入 核心思想是这样的 我有800000枚硬币要在900000个插槽中分发。暴力强制python循环模拟如下所示: import random for coin in coins: #assume we have a list of coins slot = random.choice(slots) #assume we have a list of slots, which are sets. slot.ad

我有以下问题,这是一个重新设计的家庭作业问题,我希望在即将到来的教程中加入

核心思想是这样的

我有800000枚硬币要在900000个插槽中分发。暴力强制python循环模拟如下所示:

import random
for coin in coins: #assume we have a list of coins
    slot = random.choice(slots) #assume we have a list of slots, which are sets.
    slot.add(coin)
现在,如果我们在一些小的槽中做一些小数量的硬币,这是非常快的。但是有了成千上万的硬币和插槽,这时一些速度优化可能真的很好。有没有一种方法可以用numpy实现这一点

FWIW我见过和中介绍的解决方案,但没有一个是矢量化的。

这是怎么回事:

import numpy as np
coins = 800000
slots = 900000

coin_positions = np.random.randint(slots, size=coins)

coins_per_slot = np.histogram(coin_positions, bins=np.arange(slots + 1))[0]
如果有比硬币少得多的插槽,您可以使用a来计算每个插槽的随机硬币数:要在k个插槽中分配n个硬币,请生成x~B(n,1/k)。然后第k个插槽包含x个硬币,您继续在k-1插槽中分配n-x个硬币:

for i in range(k, 0, -1):
    x = np.random.binomial(n, 1./i)
    coins_per_slot[i-1] = x
    n -= x
那么这个呢:

import numpy as np
coins = 800000
slots = 900000

coin_positions = np.random.randint(slots, size=coins)

coins_per_slot = np.histogram(coin_positions, bins=np.arange(slots + 1))[0]
如果有比硬币少得多的插槽,您可以使用a来计算每个插槽的随机硬币数:要在k个插槽中分配n个硬币,请生成x~B(n,1/k)。然后第k个插槽包含x个硬币,您继续在k-1插槽中分配n-x个硬币:

for i in range(k, 0, -1):
    x = np.random.binomial(n, 1./i)
    coins_per_slot[i-1] = x
    n -= x
那么这个呢:

import numpy as np
coins = 800000
slots = 900000

coin_positions = np.random.randint(slots, size=coins)

coins_per_slot = np.histogram(coin_positions, bins=np.arange(slots + 1))[0]
如果有比硬币少得多的插槽,您可以使用a来计算每个插槽的随机硬币数:要在k个插槽中分配n个硬币,请生成x~B(n,1/k)。然后第k个插槽包含x个硬币,您继续在k-1插槽中分配n-x个硬币:

for i in range(k, 0, -1):
    x = np.random.binomial(n, 1./i)
    coins_per_slot[i-1] = x
    n -= x
那么这个呢:

import numpy as np
coins = 800000
slots = 900000

coin_positions = np.random.randint(slots, size=coins)

coins_per_slot = np.histogram(coin_positions, bins=np.arange(slots + 1))[0]
如果有比硬币少得多的插槽,您可以使用a来计算每个插槽的随机硬币数:要在k个插槽中分配n个硬币,请生成x~B(n,1/k)。然后第k个插槽包含x个硬币,您继续在k-1插槽中分配n-x个硬币:

for i in range(k, 0, -1):
    x = np.random.binomial(n, 1./i)
    coins_per_slot[i-1] = x
    n -= x

对于此任务,可能是比
np.histogram
更好的选择。对于此任务,可能是比
np.histogram
更好的选择。对于此任务,可能是比
np.histogram
更好的选择。对于这项任务来说,这可能是比np直方图更好的选择。这不是一个包含800000次试验和900000次潜在结果的多项式分布吗?这不是一个包含800000次试验和900000次潜在结果的多项式分布吗?这不是一个包含800000次试验和900000次潜在结果的多项式分布吗?不是吗这是一个多项式分布,有80万次试验和90万次潜在结果?