在Python中,我希望以一种方式对列表进行洗牌,使得每个元素最终不会超过N它开始的元素,其中N是一个常量.另外,我希望这是公平的.也就是说,满足此约束的每个排列应该是同等可能的(在随机数生成器的实际限制内).
例如,如果N是3,输入是[1, 2, 3, 4, 5, 6],那么结果[2, 1, 3, 6, 4, 5]将是有效的,但[6, 4, 1, 3, 5, 2]不会,因为6和2离它们的起始位置太远.
有没有一种简单的方法在Python中执行此操作?如果没有,是否有一些现有算法可以做到这一点?伪代码很好,如果需要我可以在Python中实现它.
运行时并不是非常重要,因为我每隔几分钟就会在~100k元素上运行一次这样的shuffle,所以如果有必要,我可以等待几秒钟让它运行.
我正在尝试为家庭作业编写遗传算法来解决旅行商问题.
我正在尝试的一个突变功能是random.shuffle在巡演中使用.
当我阅读文档时random.shuffle,我看到:
shuffle(self, x, random=None, int=<type 'int'>) method of random.Random instance
x, random=random.random -> shuffle list x in place; return None.
Optional arg random is a 0-argument function returning a random
float in [0.0, 1.0); by default, the standard random.random.
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下这个函数中"random"参数的功能吗?我已经阅读了这个问题,但它没有回答我的问题.
我特别喜欢使用这个函数,如果我可以以某种方式控制随机播放的随机性(如果这有任何意义)