【发布时间】:2023-04-03 21:00:01
【问题描述】:
假设我有 5 个弹珠,3 个是红色的,2 个是蓝色的。
相同颜色的弹珠编号从1 到n,其中n 是该颜色的弹珠数量。
我需要的是洗牌列表 ['red', 'red', 'red','blue', 'blue'] ,其中单个弹珠的排列无关紧要。
例如
['red1', 'red2', 'red3','blue', 'blue'] 和
['red2', 'red1', 'red3','blue', 'blue']
只是一种解决方案。
因为我最初的问题有更多的一种颜色的弹珠,与其他的相比,列表的正常洗牌会导致某些订单的偏差很大。
我的一个想法是:
- 从一个新的空列表开始,
- 生成 2 个随机整数(第一个整数用于选择颜色,第二个整数用于确定选择该颜色的弹珠数量)
- 将挑选的弹珠添加到新列表中
- 重复直到所有弹珠都用完
我想知道是否有更好的方法来解决这个问题,也许可以保证更公正的结果。
编辑: 一个小规模的场景将是 4 种不同的颜色,每种颜色有 2 到 5 个弹珠。 现实情况是 20 差异。颜色,每种颜色有 5 到 50 个弹珠。
【问题讨论】:
-
因为这是一个性能问题,有多少可能的值,列表有多大?
-
颜色不应该改变位置吗?您只想按相同的颜色随机播放?
-
“列表的正常洗牌会导致某些顺序的高偏差。” 你这是什么意思?无论有多少重复项,像 Fisher-Yates (which
random.shuffleimplements) 这样的标准洗牌算法都会给出无偏见的洗牌。 -
@kaya3 : 如果我想洗牌 ['red', 'red', 'blue] Fisher-Yates 会像 ['red1','red2','blue'] 那样处理它,如果我正确理解了算法。这增加了看起来完全相同的解决方案,但分布将朝着这些结果变化
-
它以与所有解决方案相同的比例添加“看起来相同”的解决方案。对于您的示例,Fisher-Yates 将以相等的概率生成 (red,red,blue)、(red,blue,red) 和 (blue,red,red)。怎么能少一点偏见呢?
标签: python algorithm list shuffle