讨论/算法和数据结构/求助大佬们关于随机排列的好算法/
求助大佬们关于随机排列的好算法

首先开发工具是python3哦
这边需要将几个元素随机排列到一个8x7的列表里,原则上平均分配 如有20个元素会每个元素排列两次,再随机抽取16个元素进行排序,其中排序需要满足一些特定的规则
这边用 20个元素复制一次,再将多余的16个元素再次添加进一个56个元素的bigList列表
在while循环中用random.shuffle函数将bigList打乱再按下标依次插入 插入完成后按照规则进行条件判断,若不满足条件则重新shuffle再插入直至满足条件。这样一来时间复杂性太高了,元素为14个时需要3-4秒完成判断,11个时甚至长时间运算不出结果(因为元素越少满足规则的排列越少)
有没有大佬有好一点的算法提供,本人编程小白,卡了一个星期了想不好方法。
规则是相同的元素不能排在List的同一列List是8X7的列表,为最后的输出结果

PS:有没有机智的小伙伴知道这个功能是干什么的😄

展开讨论
薛定谔的珠穆朗玛峰发起于 2020-04-17
最近编辑于 2020-04-17
共 5 个讨论

这就是甲方的需求描述............
看得懂的,才是真大佬!

1

有偿解答哦

你可以根据shuffle 排序的原理和base64加密算法的原理构思一下


   def shuffle(self, x, random=None):
        """Shuffle list x in place, and return None.
        将列表x随机排序,然后返回None。

        Optional argument random is a 0-argument function returning a
        random float in [0.0, 1.0); if it is the default None, the
        standard random.random will be used.
        可选参数random是一个0参数的函数,返回一个
         [0.0,1.0)中的随机浮点数; 如果是默认值None,则
         将使用标准random.random。

        """

        if random is None:
            randbelow = self._randbelow
            for i in reversed(range(1, len(x))):
                # pick an element in x[:i+1] with which to exchange x[i]
                # 选择数组x [:i + 1]中与x [i]交换的元素

                j = randbelow(i+1)
                x[i], x[j] = x[j], x[i]
        else:
            _int = int
            for i in reversed(range(1, len(x))):
                # pick an element in x[:i+1] with which to exchange x[i]
                # 选择数组x [:i + 1]中与x [i]交换的元素

                j = _int(random() * (i+1))
                x[i], x[j] = x[j], x[i]

先对 20 个元素 shuffle 一下,取前 16 个。这样得到 56 个元素。
然后往 8 * 7 里面的列表里填。一列一列的填,每次从剩余的且符合条件的数里面随机一个出来就行。这样也不一定满足规则,可能最后一列剩 3 个 1

不是,到底要满足什么规则啊