如何重新排序二进制列表,但保持1在列表中大致均匀地分开?

问题描述 投票:0回答:2

我基本上想重新排序(不要认为这是一个洗牌任务)100个二进制数的列表。重新排序后应保留以下属性:1的固定频率应保留,即10,1应大致相互分开,如下所示,因此每9,10或11位数为1。我想要这种重新排序是随机的。我想到的琐碎方法是跟踪输入列表中第一个1的索引并生成一个新的起始索引。其他解决方案的想法?

    x = [1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0]
python python-3.x python-2.7 list
2个回答
0
投票

代码如下:

def main():
    from random import shuffle
    from random import randint
    from itertools import chain

    num_of_10th = randint(0, 5) * 2
    num_of_11th = num_of_9th = int((10 - num_of_10th) / 2)

    lsts = []
    for i in range(num_of_10th):
        lsts.append([1, 0, 0, 0, 0, 0, 0, 0, 0, 0])

    for i in range(num_of_9th):
        lsts.append([1, 0, 0, 0, 0, 0, 0, 0, 0])

    for i in range(num_of_11th):
        lsts.append([1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

    shuffle(lsts)

    lsts = list(chain.from_iterable(lsts))
    print(lsts)

0
投票

你可以使用python的列表乘法。

我的解决方案将使用size生成1到10之间的随机random.randint。从这个size我创建了以1开头的repeated_part并用零填充其余部分。例如,当size是5时repeated_part将是[1, 0, 0, 0, 0]

从大小我们可以计算它适合100个100//spread列表的次数,我们添加一个溢出。现在列表太大了,例如size为3,列表的总大小是((100/3)+1)*3 = 102,所以我们用[:100]截断列表长度为100。

import random
size = random.randint(1, 10)

repeated_part = [1] + [0]*(size-1)
result = (repeated_part * (100 // size + 1)) [:100]

注意,你希望1首先不能启动你可以使用random.shuffle(repeated_part),但仍然保持所有其他要求。

© www.soinside.com 2019 - 2024. All rights reserved.