2012-04-24 7 views
2

예 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 

편집 : 결과 숫자의 각 파티션의 수보다 더 적은 없어야 초기 숫자 1과 0의 수보다 작아야합니다.

+0

임의의 요소 수를 지정하십시오. 하위 집합의 모든 길이가 선택 될 확률이 같은 것을 의미합니까? 또는 모든 하위 집합이 선택 될 가능성이 동일한 것을 의미합니까? 그것들은 매우 다른 것들을 의미합니다. –

+2

언제 [7] 돌려 주어야합니까? [0,0,0,0,0,7]은 어떨까요? 가능한가? – DanRedux

+0

죄송합니다. 그 사실을 분명히해야했습니다. 아니요, 아니요 .. – Stpn

답변

9

나는 다음에 갈 것 :

>>> 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] 

그러나이 임의의 분포가 완벽하게 균일 한 것인지 확실하지 않습니다. 구조에

+0

좋아요! 고마워요! 나는 SO가 허락하자마자이 대답을 받아 들일 것입니다. – Stpn

+0

좋은 답변입니다! Minor Point :'n = rn.randint (0, i)'를 사용하면 Stpn이 원했던 0이 허용됩니다. – Akavall

+0

@Akavall : 또한 0을 많이 축적 할 수 있습니다. –

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)을 할 수 있지만, 공유하지 않는 숨겨진 이유가 없다면 의미가 없습니다. 응답

편집 편집을 질문 :

def potentiallyInfiniteCopies(x): 
    while random.random()<0.5: 
     yield x 

x = list(arbitraryPartitionLessThan(n)) 
x += [0]*len(x) + list(potentiallyInfiniteCopies(0)) 

이 질문은 : 당신이 원하는 때문에 당신이 임의의 끝에 0을 추가 할 수 있습니다 "제로의 수는 파티션의 수보다 더 적은 없을 것" 아주 임의의, 그리고 내가보기 엔 당신이 대신 답변으로 이것을 선택하는 것이 좋습니다 :

def arbitraryPartition(n): 
    """Returns an arbitrary non-random partition""" 
    while n>0: 
     x = random.randrange(1,n+1) 
     yield x 
     n -= x 
+0

작곡 물의 수는 기하 급수적으로 빠르게 증가합니다. 따라서 n의 적당한 값조차도 모든 기억을 소모 할 수 있습니다. – btilly

+0

그런 철저한 답변을 해주셔서 감사합니다. – Stpn

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] 
+1

[1,1,1,1,1,1,1]은 어디에 있습니까? –

+0

@AshwiniChaudhary : 반환되는 시퀀스의 확률을 계산하면 답이 있습니다. – geoffspear

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 
관련 문제