সেট থেকে এলোমেলো.চয়েস? অজগর


94

আমি অনুমান করা গেমের একটি এআই অংশে কাজ করছি। আমি চাই এআই এই তালিকা থেকে একটি এলোমেলো চিঠি নির্বাচন করুন। আমি এটি সেট হিসাবে করছি তাই আমি সহজেই তালিকা থেকে অক্ষরগুলি মুছে ফেলতে পারি কারণ সেগুলিতে গেমটি অনুমান করা হয় এবং তাই আর অনুমান করার জন্য আর উপলব্ধ নেই।

এটি বলে যে setঅবজেক্ট ইনডেক্সযোগ্য নয়। আমি কীভাবে এটিকে ঘিরে কাজ করতে পারি?

import random 
aiTurn=True

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



    print (aiGuess) 

4
ঘটনাক্রমে আপনার অক্ষরের একটি সেট পেতে সেট (তালিকা ('স্ট্রিং')) ব্যবহার করার দরকার নেই যেহেতু স্ট্রিংগুলি নিজের দ্বারা পুনরুক্ত করা যায় - সেট ('এবিসি') আপনি যা চান তা করবে।
স্কট রিচি

4
অন্যদের মধ্যে এই সমস্যার মুখোমুখি হওয়ার জন্য, কীভাবে একটি সেট-জাতীয় বস্তু তৈরি করা যায় যা দক্ষ এলোমেলো নির্বাচনের অনুমতি দেয় সে সম্পর্কে এই প্রশ্নটি দেখার মতো। এখানে প্রদত্ত বিকল্পগুলি সমস্ত ও (এন)। stackoverflow.com/q/15993447/2966723
জোয়েল

উত্তর:


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

ডকুমেন্টেশন: https://docs.python.org/3/library/random.html#random.sample


9
[0]শেষে টেক করুন যাতে এটি মূলত অভিন্ন random.choice(যা তালিকার আকারে এটির মানগুলি দেয় না)
নিক টি

31
random.sampleনেই tuple(population)অভ্যন্তরীণভাবে, তাই random.choice(tuple(allLetters))ভাল হতে পারে।
utapyngo

21
এটি হাইলাইট করা উচিত যে এই প্রক্রিয়াটি হ'ল (এন)।
জোয়েল

@ জোয়েল এই প্রক্রিয়াটি ও (এন) কেন?
ম্যানুয়েলস্কিনিড 3 ই

4
আমি মনে করি এটি সত্যিই অদক্ষ ... আপনি যেমন দেখতে পারবেন github.com/python/cpython/blob/2.7/Lib/random.py#L332-L339 নমুনা ফাংশন প্রতিবার আপনি উপরের কল করার পরে সেট থেকে একটি তালিকা তৈরি করে এবং এটি থেকে এলোমেলো উপাদান নেয় takes মনে করুন আপনার কাছে একটি বিশাল সেট রয়েছে এবং আপনি প্রচুর নমুনা তৈরি করতে চান। যদি সেটটি পরিবর্তন না করে তবে এটিকে তালিকায় রূপান্তর করা এবং ব্যবহার করা ভাল random.choice। আপনি যদি নমুনা দেওয়ার সময় সেটটিও পরিবর্তিত হয় তবে সম্ভবত আপনার কোনও সেট ব্যবহার করা উচিত নয়। আপনি যদি সেটটিতে ও বালতি মাপের দখলযুক্ত হ্যাশগুলি জানতেন তবে একটি নমুনা ফাংশনটি লেখা সহজ হবে ...
jakab922

58

আপনি ব্যবহার করা উচিত 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% বেশি সময় নেয়।


4
আমার মেশিনে, এলোমেলো.চয়েস 7 গুন দ্রুত।
noɥʇʎԀʎzɐɹƆ

4
সেট থেকে সরাসরি টুপলে কপি না করেই বাছাই করার কোনও উপায় নেই?
Youda008

আমি নমুনাটি প্রায় 12% (250 মিশ্র) 5000 টি উপাদানগুলির একটি সেট থেকে চয়ন করার চেয়ে ধীর পাচ্ছি।
সাইমন

4
আমার মেশিনে, সেট আকারটি বাড়ার সাথে সাথে তার চেয়ে দ্রুত random.sampleগতি থেকে ধীরে ধীরে ধীরে ধীরে চলে যায় random.choice(ক্রসওভার পয়েন্টটি সেট আকারের 100k-500k এর মাঝে কোথাও রয়েছে)। অর্থাৎ সেটটি যত বড় random.sampleহবে তত দ্রুত হওয়ার সম্ভাবনা তত বেশি।
জেকি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.