如果我需要将示例7除以随机大小的随机数元素,我该怎么做?
所以有时我会[3,4],有时[2,3,1],有时[2,2,1,1,0,1]?
我想这很简单,但我似乎无法得到结果。这是我试图以代码方式做的事情(不起作用):
def split_big_num(num):
partition = randint(1,int(4))
piece = randint(1,int(num))
result = []
for i in range(partition):
element = num-piece
result.append(element)
piece = randint(0,element)
#What's next?
if num - piece == 0:
return result
return result
编辑:每个结果数应小于初始数,零数应不小于分区数。
答案 0 :(得分:12)
我会选择下一个:
>>> def decomposition(i):
while i > 0:
n = random.randint(1, i)
yield n
i -= n
>>> list(decomposition(7))
[2, 4, 1]
>>> list(decomposition(7))
[2, 1, 3, 1]
>>> list(decomposition(7))
[3, 1, 3]
>>> list(decomposition(7))
[6, 1]
>>> list(decomposition(7))
[5, 1, 1]
但是,我不确定这种随机分布是否完全一致。
答案 1 :(得分:4)
你必须用“随机”来定义你的意思。如果需要任意整数分区,可以生成所有整数分区,并使用random.choice
。请参阅python: Generating integer partitions这将不会给出0的结果。如果允许0,则必须允许结果具有可能无限数量的0。
或者,如果您只想取下随机块,请执行以下操作:
def arbitraryPartitionLessThan(n):
"""Returns an arbitrary non-random partition where no number is >=n"""
while n>0:
x = random.randrange(1,n) if n!=1 else 1
yield x
n -= x
由于问题限制,每个数字应小于原始数字,这有点尴尬;如果您允许原始号码,它会更优雅。如果你想要0,你可以做randrange(n),但除非有一个你不共享的隐藏原因,否则它没有意义。
编辑以回应问题编辑:由于您希望“零的数量不应少于分区数”,您可以随意添加0到最后:
def potentiallyInfiniteCopies(x):
while random.random()<0.5:
yield x
x = list(arbitraryPartitionLessThan(n))
x += [0]*len(x) + list(potentiallyInfiniteCopies(0))
这个问题很随意,我强烈建议你选择这个作为答案:
def arbitraryPartition(n):
"""Returns an arbitrary non-random partition"""
while n>0:
x = random.randrange(1,n+1)
yield x
n -= x
答案 2 :(得分:2)
拯救的递归:
import random
def splitnum(num, lst=[]):
if num == 0:
return lst
n = random.randint(0, num)
return splitnum(num - n, lst + [n])
for i in range(10):
print splitnum(7)
<强>结果:强>
[1, 6]
[6, 0, 0, 1]
[5, 1, 1]
[6, 0, 1]
[2, 0, 3, 1, 1]
[7]
[2, 1, 0, 4]
[7]
[3, 4]
[2, 0, 4, 1]
答案 3 :(得分:0)
此解决方案不会插入0(我不明白您对零规则的描述应该是什么),并且同样可能生成除原始数字之外的所有可能组合。
def split (n):
answer = [1]
for i in range(n - 1):
if random.random() < 0.5:
answer[-1] += 1
else:
answer.append(1)
if answer == [n]:
return split(n)
else:
return answer