random.choice函数没有提供正确的结果,这是什么问题



这里我正在做模拟实验,用数量相等的球填充预定义数量的箱子。我首先定义了一些bin和ball列表以及num_exp,以进行大量的实验。

出于这个原因,在代码的第二部分中,我创建了和列表中定义的一样多的球和空箱子。

在代码的第三部分中,我用规则k=1填充垃圾箱,这意味着每一个球都会有一个随机垃圾箱来,球会去那里(min((函数已经为k=2的情况编写,其中2个垃圾箱随机来,球将去到占用最少的一个(。

重点是,我需要用预定义数量的实验来做这个实验,并为此添加外循环。如果你去掉外环,它会非常好地工作,但现在它确实提供了更好的结果。我想它与随机函数有关,但不能准确地定义或解决这个问题。如果有人帮忙,我将不胜感激。提前谢谢。

bins_balls = [10,20,30,40,50]
num_exp = 15

balls = []
bins = []
for i in range(len(bins_balls)):
ball_pack = np.ones(bins_balls[i])
balls.append(ball_pack)
bin_lists = [[] for i in range(balls[i].shape[0])]
bins.append(bin_lists)

bins_new = []
for exp in range(num_exp):
random.seed(exp+1)
for pack in range(len(balls)):
for ball in range(balls[pack].shape[0]):
selected = random.choices(bins[pack], k = 1) #pick random k number of bins uniformly with replacement
min(selected, key=len).append(balls[pack][ball]) # place the ball to the least occupied one  
bins_new.append(bins)

问题似乎是,您为每个实验重复使用相同的bins列表,将元素附加到它们的子列表中,然后将整个元素添加到bins_new中,每个实验都引用一个实例。

相反,在为不同的实验修改bins之前,您可能应该(深度(复制它们:

import copy
bins_new = []
for exp in range(num_exp):
random.seed(exp+1)
bins2 = copy.deepcopy(bins)
for pack in range(len(balls)):
for ball in range(balls[pack].shape[0]):
selected = random.choices(bins2[pack], k = 1)
min(selected, key=len).append(balls[pack][ball])
bins_new.append(bins2)

最新更新