programing

무작위입니다. 세트에서 선택하시겠습니까?비단뱀

muds 2023. 4. 26. 23:50
반응형

무작위입니다. 세트에서 선택하시겠습니까?비단뱀

저는 추측 게임의 인공지능 부분을 연구하고 있습니다.나는 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.sample7% 더 오래 걸립니다.

당신은 이 문제를 해결할 수 있습니다.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

반응형