2014-12-02 2 views
0

40 개의 요소 목록이 있습니다. 목록에있는 모든 요소를 ​​재생산하기 위해이 목록을 샘플링해야하는 횟수를 예상하려고합니다. 그러나 선택한 요소를 바꾸는 것이 중요합니다. 나는. 나는 같은 요소를 20 번 골라 낼 수도있다. 지금까지 나는 다음과 같은 것을 가지고있다.python을 사용하여 대체 목록이있는 임의의 요소를 선택하십시오.

import random 
l = range(0,40) 

seen=[] 
x=0 
while len(seen)<len(l): 
    r = random.choice(l) 
    if r not in seen: 
     seen.append(r) 
     x=x+1 
print x 

그러나 이것은 항상 내가 원하는 것을 성취하는데 40 번 걸렸다. 그러나 이는 단일 요소가 두 번 선택되지 않기 때문입니다. 결국 샘플링해야 할 빈도를 얻기 위해이 함수를 1000 번 실행합니다. 언제나 그렇듯이

답변

3

을 얻을 수 달라질 수 있습니다. 왜냐하면 값이 이전에 보지 않았 으면 바로 증가하기 때문입니다.

많은 항목을 자주 사용하는 경우 액세스 항목이 faster in avarage이므로 seen 변수로 set을 사용할 수 있습니다.

l = range(0, 40) 
seen = set() 
x = 0 
while len(seen) < len(l): 
    r = random.choice(l) 
    if r not in seen: 
     seen.add(r) 
    x = x + 1 
print x 
1

다음과 비슷한 방법이 있습니다. 정의에 따라 고유 한 요소 (중복 없음) 만 포함 할 수있는 set을 초기화합니다. 그런 다음 random.choice()을 계속 사용하여 목록에서 요소를 선택하십시오. 당신은 당신의 세트를 원래의리스트와 비교할 수 있으며, 같은 크기가 될 때까지 모든 요소를 ​​가지고 있지는 않습니다. 얼마나 많은 무작위 선택을하는지 카운터를 유지하십시오.

import random 

def sampleValues(l): 
    counter = 0 
    values = set() 
    while len(values) < len(l): 
     values.add(random.choice(l)) 
     counter += 1 
    return counter 

>>> l = list(range(40)) 

이 수는 몬테 카를로 당신은 단지 x=x+1의 들여 쓰기를 조정할 필요가 일부 통계

>>> sampleValues(l) 
180 
>>> sampleValues(l) 
334 
>>> sampleValues(l) 
179 
관련 문제