2013-04-05 18 views
39

私は推測ゲームのAI部分に取り組んでいます。 AIがこのリストからランダムな文字を選択するようにします。私はセットでそれをやっているので、ゲームで推測されるようにリストから手紙を簡単に取り除くことができるので、もう一度推測することはできません。random.choice from set? python

"set"オブジェクトはインデックスできません。これを回避するにはどうしたらいいですか?

import random 
aiTurn=True 

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



    print (aiGuess) 
+1

ちなみにset(list( 'string'))を使って文字列を取得する必要はありません。文字列はそれ自身で反復可能であるため、set( 'abc')は必要な処理を行います。 –

+3

この問題に遭遇した人にとっては、効率的なランダム選択を可能にするセット様オブジェクトを作成する方法についてこの質問を検討する価値があります。ここで与えられたオプションはすべてO(N)です。 http://stackoverflow.com/q/15993447/2966723 – Joel

答えて

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

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

+6

最後に '[0]'を付け加えるので、 'random.choice'と基本的に同じです(リストの形で値を返しません) –

+19

'random.sample'は' tuple(population) 'を内部的に行いますので、' random.choice(tuple(allLetters)) 'が良いかもしれません。 – utapyngo

+6

このプロセスがO(N)であることを強調表示する必要があります。 – Joel

36

あなたはそれが高速ですので、間違いなくクリーナーrandom.sampleよりも見て、random.choice(タプル(MYSET))を使用する必要があります。私はテストするために次のように書きました:

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%長くかかるようです。

+0

私のマシンでは、random.choiceは7倍高速です。 –

+0

タプルにコピーすることなく、セットから直接選択する方法はありませんか? – Youda008

+0

私は、サンプルを5000要素のセットを選択するよりも約12%(250ms)遅く感じます。 – Simon