2
如何洗彩球?
我有400个球,其中100个是红色,40个是黄色,50个是绿色,60个是蓝色,70个是紫色,80个是黑色。(相同颜色的球是相同的) 我需要一种有效的改组算法,以便在改组后,球在列表中,并且 任何连续的3个球的颜色都不相同。例如,我不能有“红色,红色,红色,黄色...” 并且,所有排列都可能“相等地”发生。(好吧,如果效率与无偏之间的权衡足够好,那么我不介意比无偏有更多的效率)。 我试图改编Fisher-Yates-Knuth,但结果并不理想。 为什么Fisher-Yates不够好?FY采用蒙特卡洛逆变换。输出分配对相同的色球的处理方式有所不同,即它会为我的需求产生偏差的结果。 而且,天真的想法是从整个空间过滤/回溯所有不良排列。例如,当限制非常严格时,如果我们只有300个球,而其中100个是红色的,那么在获得适当的排列之前,将存在太多的反向跟踪/失败。 因此,最终,我希望能够迭代所有好的排列。但是,由于有效排列的数量太大,因此我只能随机抽样其中的一些。我想让其中“一些”的统计特征尽可能类似于人口。