我基本上想重新排序(不要认为这是一个洗牌任务)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]
代码如下:
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)
你可以使用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)
,但仍然保持所有其他要求。