세트에서 random.choice? 파이썬


95

추측 게임의 AI 부분을 작업 중입니다. AI가이 목록에서 임의의 문자를 선택하기를 원합니다. 게임에서 추측되는 문자를 목록에서 쉽게 제거 할 수 있으므로 더 이상 추측 할 수 없습니다.

set개체가 색인을 생성 할 수 없다고 말합니다 . 이 문제를 어떻게 해결할 수 있습니까?

import random 
aiTurn=True

while aiTurn == True:
    allLetters = set(list('abcdefghijklmnopqrstuvwxyz'))
    aiGuess=random.choice(allLetters)



    print (aiGuess) 

1
덧붙여서 문자열은 스스로 반복 할 수 있기 때문에 문자 집합을 얻기 위해 set (list ( 'string'))을 사용할 필요가 없습니다. set ( 'abc')는 원하는 것을 할 것입니다.
Scott Ritchie

5
이 문제가 발생하는 다른 사람들을 위해 효율적인 무작위 선택을 허용하는 집합 형 객체를 만드는 방법에 대한이 질문을 살펴볼 가치가 있습니다. 여기에 제공된 옵션은 모두 O (N)입니다. stackoverflow.com/q/15993447/2966723
Joel

답변:


93
>>> random.sample(set('abcdefghijklmnopqrstuvwxyz'), 1)
['f']

문서 : https://docs.python.org/3/library/random.html#random.sample


9
[0]끝에 a 를 붙여 기본적으로 동일합니다 random.choice(목록 형태로 값을 반환하지 않음)
Nick T

31
random.sample않습니다 tuple(population)내부, 그래서 random.choice(tuple(allLetters))더 좋을 수 있습니다.
utapyngo

21
이 프로세스는 O (N)임을 강조해야합니다.
조엘

@Joel 왜이 프로세스가 O (N)입니까?
ManuelSchneid3r

3
정말 비효율적이라고 생각합니다 ... github.com/python/cpython/blob/2.7/Lib/random.py#L332-L339 에서 볼 수 있듯이 샘플 함수는 위의 호출을 할 때마다 집합에서 목록을 생성하고 임의의 요소를 가져옵니다. 큰 세트가 있고 많은 샘플을 만들고 싶다고 가정합니다. 세트가 변경되지 않으면 목록으로 변환하고 random.choice. 샘플링하는 동안 세트도 변경되면 세트를 전혀 사용하지 않아야 할 것입니다. 당신이 세트의 점유 해시를 알 것 버킷이 크기 경우는 샘플링 함수를 작성하기 쉬운 것입니다 ...
jakab922

59

을 사용해야합니다... random.choice(tuple(myset))보다 빠르고 깔끔하게 보이기 때문 random.sample입니다. 테스트를 위해 다음을 작성했습니다.

import random
import timeit

bigset = set(random.uniform(0,10000) for x in range(10000))

def choose():
    random.choice(tuple(bigset))

def sample():
    random.sample(bigset,1)[0]

print("random.choice:", timeit.timeit(choose, setup="global bigset", number=10000)) # 1.1082136780023575
print("random.sample:", timeit.timeit(sample, setup="global bigset", number=10000)) # 1.1889629259821959

숫자로 볼 때 random.sample7 % 더 오래 걸리는 것 같습니다 .


2
내 컴퓨터에서 random.choice는 7 배 더 빠릅니다.
noɥʇʎԀʎzɐɹƆ

5
튜플에 복사하지 않고 세트에서 직접 선택할 수있는 방법이 없습니까?
Youda008

샘플은 5000 개 요소 세트에서 선택한 것보다 약 12 ​​% (250ms) 느립니다.
Simon

1
내 컴퓨터에서는 설정 크기가 커짐에 따라 속도보다 random.sample느리다 random.choice(크로스 오버 지점이 설정 크기 100k-500k 사이 어딘가에 있음). 즉, 세트가 클수록 더 random.sample빨라질 가능성이 높습니다 .
jakee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.