假设我有5个弹珠,3个是红色的,2个是蓝色的。
相同颜色的大理石从1
到n
编号,其中n
是该颜色大理石的数量
我需要的是对列表进行洗牌,其中单个大理石的排列并不重要
例如
['red1', 'red2', 'red3','blue', 'blue']
和
['red2', 'red1', 'red3','blue', 'blue']
只有一种解决办法
因为我最初的问题是一种颜色的大理石比其他颜色的大理石多得多,所以列表的正常无序排列会导致某些顺序的高偏差
我的一个想法是:
我想知道是否有更好的方法来解决这个问题,也许有更可靠的无偏结果
编辑: 一个小规模的场景是4种不同的颜色,每种颜色有2到5个大理石。 一个现实的场景是20种不同的颜色,每种颜色有5到50颗大理石
这将使Unique组合的分布均匀:
性能似乎是线性的,我通过如下抽样测试了分布:
该样本(以及我尝试过的其他几个样本)的结果具有决定性:
如果你想要一个无偏的洗牌,那么你将把你的算法与Knuth的(Fisher-Yate的稍有改进的版本)shuffle
如果您打算使用两阶段选择进行优化,并希望其保持公平,则需要计算获得相同颜色的一、二、三个运行的概率,并比相应的交换数量更有效地执行此计算,然后将源中的副本数量写入目标列表
为了性能,我不想费心了,因为对于1000颗弹珠,你不太可能通过在交换过程中进行数学运算来提高性能——你必须在每个阶段进行另一次列表迭代来计算概率,然后进行额外的工作,这将使它成为O(N²)而不是O(N)
相关问题 更多 >
编程相关推荐