117

私は推測ゲームの AI 部分に取り組んでいます。AIにこのリストからランダムな文字を選択させたい. 私はセットとしてそれを行っているので、ゲームで推測された文字をリストから簡単に削除できるため、再び推測することはできなくなります。

setオブジェクトはインデックス可能ではないと言っています。どうすればこれを回避できますか?

import random 
aiTurn=True

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



    print (aiGuess) 
4

5 に答える 5

119

注 (2020 年 10 月): v3.9 の時点で、Python はセットでの作業を公式に非推奨 random.sample()にしました。公式のガイダンスでは、セットを渡す前に明示的にリストまたはタプルに変換しますが、これは効率の問題を解決しません。 .


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

ドキュメント: https://docs.python.org/3/library/random.html#random.sample

セットからランダムな要素を選択することは、どのように行っても非常に非効率的であることに注意してください。セットのサイズに比例して時間がかかります。削除された要素のためにセットの基になるハッシュ テーブルがまばらな場合はさらに悪化します。

代わりに、この操作を効率的にサポートする別のデータ構造を使用する必要があります。

于 2013-04-05T15:29:10.080 に答える
69

を使用する必要があり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% 長くかかるようです。

于 2014-07-25T06:53:27.227 に答える
1

セットからランダムな要素を取得したい場合。

a = set()
for i in range(10):
    a.add(i)
a.pop() // gives a random element from a set
于 2021-07-28T04:23:59.977 に答える