2013-04-05 11 views
39

Tôi đang làm việc trên một phần AI của trò chơi đoán. Tôi muốn AI chọn một bức thư ngẫu nhiên từ danh sách này. Tôi đang làm nó như là một bộ để tôi có thể dễ dàng loại bỏ các chữ cái từ danh sách như họ được đoán trong trò chơi và do đó không còn có sẵn để được đoán một lần nữa.random.choice từ bộ? python

nó cho biết đối tượng "đặt" không thể lập chỉ mục được. Tôi làm cách nào để giải quyết vấn đề này?

import random 
aiTurn=True 

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



    print (aiGuess) 
+1

Ngẫu nhiên bạn không cần phải sử dụng bộ (danh sách ('chuỗi')) để có được một bộ chữ vì chuỗi có thể lặp lại được - set ('abc') sẽ làm những gì bạn muốn. –

+3

Đối với những người khác gặp phải vấn đề này, bạn nên xem câu hỏi này về cách tạo một đối tượng giống như thiết lập cho phép lựa chọn ngẫu nhiên hiệu quả. Các tùy chọn được đưa ra ở đây là tất cả O (N). http://stackoverflow.com/q/15993447/2966723 – Joel

Trả lời

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

Tài liệu: https://docs.python.org/3/library/random.html#random.sample

+6

Tack vào một '[0]' ở cuối để nó về cơ bản giống với 'random.choice' (không trả lại giá trị của nó dưới dạng danh sách) –

+19

'random.sample' thực hiện' tuple (dân số) 'nội bộ, vì vậy' random.choice (tuple (allLetters)) 'có thể tốt hơn. – utapyngo

+6

Cần nhấn mạnh rằng quá trình này là O (N). – Joel

36

Bạn nên sử dụng random.choice (tuple (myset)), bởi vì nó nhanh hơn và cho là sạch tìm kiếm hơn random.sample. Tôi đã viết như sau để kiểm tra:

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 

Từ những con số có vẻ như random.sample mất 7% lâu hơn.

+0

Trên máy của tôi, ngẫu nhiên.choice nhanh gấp 7 lần. –

+0

Không có cách nào để chọn trực tiếp từ bộ, mà không cần phải sao chép nó vào bộ tuple? – Youda008

+0

Tôi nhận được mẫu khoảng 12% (250 ms) chậm hơn so với lựa chọn trên một bộ 5000 phần tử. – Simon