무작위입니다. 세트에서 선택하시겠습니까?비단뱀
저는 추측 게임의 인공지능 부분을 연구하고 있습니다.나는 AI가 이 목록에서 임의의 문자를 선택하기를 원합니다.저는 게임에서 추측한 대로 쉽게 목록에서 글자를 제거할 수 있도록 세트로 하고 있기 때문에 더 이상 추측할 수 없습니다.
라고 씌어 있습니다set
개체를 인덱싱할 수 없습니다.어떻게 하면 해결할 수 있을까요?
import random
aiTurn=True
while aiTurn == True:
allLetters = set(list('abcdefghijklmnopqrstuvwxyz'))
aiGuess=random.choice(allLetters)
print (aiGuess)
참고(2020년 10월): v3.9 기준으로 파이썬은 공식적으로 더 이상 사용되지 않습니다. random.sample()
효율성 문제를 해결하지는 못하지만, 공식 지침은 전달하기 전에 세트를 목록이나 튜플로 명시적으로 변환하는 것입니다.
>>> random.sample(set('abcdefghijklmnopqrstuvwxyz'), 1)
['f']
설명서: https://docs.python.org/3/library/random.html#random.sample
집합에서 임의 요소를 선택하는 것은 어떤 방법으로든 매우 비효율적입니다. 집합의 크기에 비례하는 시간이 걸리거나, 제거된 요소로 인해 집합의 기본 해시 테이블이 희박한 경우 더 심각합니다.
대신 이 작업을 효율적으로 지원하는 다른 데이터 구조를 사용해야 합니다.
사용해야 합니다.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.sample
7% 더 오래 걸립니다.
당신은 이 문제를 해결할 수 있습니다.list
대신에set
여전히 목록에서 "쉽게" 문자를 제거할 수 있습니다.예를 들어 다음과 같이 시도합니다.
allLetters = list('abcdefghijklmnopqrstuvwxyz')
aiGuess = random.choice(allLetters)
allLetters.remove(aiGuess)
또 다른 옵션은 문자 대신 인덱스를 무작위로 선택하는 것인데, 삭제할 요소를 검색할 필요가 없기 때문에 약간 더 빠를 수 있습니다(하지만 여기서 실제로 속도가 중요한지 의문입니다).
allLetters = list('abcdefghijklmnopqrstuvwxyz')
index = random.randint(0, len(allLetters)-1) # Top is inclusive, unlike slices
aiGuess = allLetters[index]
del allLetters[index]
선택 목록이 그리 길지 않으므로 랜덤을 사용할 수 있습니다.먼저 리스트를 섞습니다.그런 다음 목록에서 각 요소를 반복합니다.이렇게 하면 목록에서 요소를 하나씩 제거하지 않고 코드를 더 깨끗하게 만들 수 있습니다.
이중 링크 리스트와 사전을 결합하여 O(1) 랜덤 선택으로 집합을 만들 수 있습니다.
만약 당신이 세트에서 임의의 요소를 얻고 싶다면.
a = set()
for i in range(10):
a.add(i)
a.pop() // gives a random element from a set
언급URL : https://stackoverflow.com/questions/15837729/random-choice-from-set-python
'programing' 카테고리의 다른 글
리눅스에서 'find-exec' 셸 함수 (0) | 2023.05.01 |
---|---|
C#의 DataTable에서 열 제거 (0) | 2023.05.01 |
비웹 SQL 주입 (0) | 2023.04.26 |
ADO를 설정하려면 어떻게 해야 합니까?윈도우즈 Azure(Preview) 관리 포털을 통한 NET Entity Framework 연결 문자열? (0) | 2023.04.26 |
병합 충돌을 초래하는 지트 스택 팝업 실행 취소 (0) | 2023.04.26 |