Asumsikan saya memiliki daftar berikut:
foo = ['a', 'b', 'c', 'd', 'e']Apa cara paling sederhana untuk mengambil item secara acak dari daftar ini?
Gunakan random.choice()
import random foo = ['a', 'b', 'c', 'd', 'e'] print(random.choice(foo))Untuk pilihan acak yang aman secara kriptografis (mis. Untuk membuat frasa sandi dari daftar kata), gunakan random.SystemRandom class
import random foo = ['battery', 'correct', 'horse', 'staple'] secure_random = random.SystemRandom() print(secure_random.choice(foo))atau secrets.choice()
import secrets foo = ['a', 'b', 'c', 'd', 'e'] print(secrets.choice(foo))Jika Anda ingin secara acak memilih lebih dari satu item dari daftar, atau memilih item dari set, saya sarankan menggunakan random.sample sebagai gantinya.
import random group_of_items = {1, 2, 3, 4} # a sequence or set will work here. num_to_select = 2 # set the number to select here. list_of_random_items = random.sample(group_of_items, num_to_select) first_random_item = list_of_random_items[0] second_random_item = list_of_random_items[1]Jika Anda hanya menarik satu item dari daftar, pilihannya kurang kikuk, karena menggunakan sampel akan memiliki sintaks random.sample(some_list, 1)[0] bukannya random.choice(some_list).
Sayangnya, pilihan hanya berfungsi untuk satu output dari urutan (seperti daftar atau tupel). Meskipun random.choice(Tuple(some_set)) mungkin menjadi opsi untuk mendapatkan satu item dari set.
EDIT: Menggunakan Rahasia
Seperti yang telah ditunjukkan oleh banyak orang, jika Anda memerlukan sampel pseudorandom yang lebih aman, Anda harus menggunakan modul rahasia:
import secrets # imports secure module. secure_random = secrets.SystemRandom() # creates a secure random object. group_of_items = {1, 2, 3, 4} # a sequence or set will work here. num_to_select = 2 # set the number to select here. list_of_random_items = secure_random.sample(group_of_items, num_to_select) first_random_item = list_of_random_items[0] second_random_item = list_of_random_items[1]Jika Anda juga membutuhkan indeks, gunakan random.randrange
Pada Python 3.6 Anda dapat menggunakan modul secrets , yang lebih disukai daripada modul random untuk kriptografi atau penggunaan keamanan.
Untuk mencetak elemen acak dari daftar:
import secrets foo = ['a', 'b', 'c', 'd', 'e'] print(secrets.choice(foo))Untuk mencetak indeks acak:
print(secrets.randbelow(len(foo)))Untuk detailnya, lihat PEP 506 .
Saya mengusulkan skrip untuk menghapus item yang diambil secara acak dari daftar sampai kosong:
Pertahankan set dan hapus elemen yang diambil secara acak (dengan choice) hingga daftar kosong.
s=set(range(1,6)) import random while len(s)>0: s.remove(random.choice(list(s))) print(s)Tiga langkah memberikan tiga jawaban berbeda:
>>> set([1, 3, 4, 5]) set([3, 4, 5]) set([3, 4]) set([4]) set([]) >>> set([1, 2, 3, 5]) set([2, 3, 5]) set([2, 3]) set([2]) set([]) >>> set([1, 2, 3, 5]) set([1, 2, 3]) set([1, 2]) set([1]) set([])foo = ['a', 'b', 'c', 'd', 'e'] number_of_samples = 1
Dengan python 2:
random_items = random.sample(population=foo, k=number_of_samples)Dengan python 3:
random_items = random.choices(population=foo, k=number_of_samples)Bagaimana cara memilih item secara acak dari daftar?
Asumsikan saya memiliki daftar berikut:
foo = ['a', 'b', 'c', 'd', 'e'] Apa cara paling sederhana untuk mengambil item secara acak dari daftar ini?
Jika Anda ingin dekat dengan benar-benar acak , maka saya sarankan menggunakan objek SystemRandom dari modul random dengan metode choice:
>>> import random >>> sr = random.SystemRandom() >>> foo = list('abcde') >>> foo ['a', 'b', 'c', 'd', 'e']Dan sekarang:
>>> sr.choice(foo) 'd' >>> sr.choice(foo) 'e' >>> sr.choice(foo) 'a' >>> sr.choice(foo) 'b' >>> sr.choice(foo) 'a' >>> sr.choice(foo) 'c' >>> sr.choice(foo) 'c'Jika Anda ingin pemilihan acak semu deterministik, gunakan fungsi choice (yang sebenarnya merupakan metode terikat pada objek Random):
>>> random.choice <bound method Random.choice of <random.Random object at 0x800c1034>>Tampaknya acak, tetapi sebenarnya tidak, yang dapat kita lihat jika kita pasang kembali berulang kali:
>>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo) ('d', 'a', 'b') >>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo) ('d', 'a', 'b') >>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo) ('d', 'a', 'b') >>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo) ('d', 'a', 'b') >>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo) ('d', 'a', 'b')jika Anda membutuhkan indeks, gunakan saja:
import random foo = ['a', 'b', 'c', 'd', 'e'] print int(random.random() * len(foo)) print foo[int(random.random() * len(foo))]random.choice melakukan hal yang sama :)
numpy solusi: numpy.random.choice
Untuk pertanyaan ini, kerjanya sama dengan jawaban yang diterima (import random; random.choice()), tapi saya menambahkannya karena pemrogram mungkin sudah mengimpor numpy sudah (seperti saya) & juga ada beberapa perbedaan antara kedua metode yang mungkin menyangkut Anda kasus penggunaan aktual.
import numpy as np np.random.choice(foo) # randomly selects a single itemUntuk reproduktifitas, Anda dapat melakukan:
np.random.seed(123) np.random.choice(foo) # first call will always return 'c'Untuk sampel satu atau lebih item , dikembalikan sebagai array, berikan argumen size:
np.random.choice(foo, 5) # sample with replacement (default) np.random.choice(foo, 5, False) # sample without replacementIni adalah kode dengan variabel yang mendefinisikan indeks acak:
import random foo = ['a', 'b', 'c', 'd', 'e'] randomindex = random.randint(0,len(foo)-1) print (foo[randomindex]) ## print (randomindex)Ini adalah kode tanpa variabel:
import random foo = ['a', 'b', 'c', 'd', 'e'] print (foo[random.randint(0,len(foo)-1)])Dan ini adalah kode dengan cara terpendek dan paling cerdas untuk melakukannya:
import random foo = ['a', 'b', 'c', 'd', 'e'] print(random.choice(foo))(python 2.7)
Kita juga bisa melakukan ini menggunakan randint.
from random import randint l= ['a','b','c'] def get_Rand_element(l): if l: return l[randint(0,len(l)-1)] else: return None get_Rand_element(l)Kode berikut menunjukkan jika Anda perlu membuat barang yang sama. Anda juga dapat menentukan berapa banyak sampel
yang ingin Anda ekstrak.
Metode sample mengembalikan daftar baru yang mengandung unsur-unsur dari populasi sambil membiarkan populasi asli tidak berubah. Daftar yang dihasilkan dalam urutan seleksi sehingga semua sub-irisan juga akan menjadi sampel acak yang valid.
Salah satu solusi mudah jika Anda mencari sesuatu seperti ini:
from random import * library = ["New York", "Berlin", "Rome"] for x in range (10): i = randrange(0,3) print(library[i])import random list=range(100) random_value=random.choice(list) print(random_value)