python ile liste içerisinki elemanları belli bi oranla rastgele nasıl seçebiliriz
Orandan kastın ne?
…
galiba ogelerin hangi oranla gelecegini kendimiz ayarliyalim diyor(ornek: %80 bir ogenin gelme ihtimali %20 diger oge)
aklima gelen tek yol su:oranlamayi liste icinde yapin daha sonra random ile listeden secin
orn:
import random
liste = [1,1,1,1,2]
print(random.choices(liste))
random ile listeden bir oge sectigimizde ‘1’ ogesinin gelme ihtimali:80%, ‘2’ ogesinin gelme ihtimali 20%
Girilen orana gore ayni itemlerden eklenip ondan sonra seçme yapilsin
aslinda bu mantiga gore kendi metodunuzuda yazabilirsiniz
Collections dan counter kullanarak itemlerin sayisina bakariz ona gore de oran yapar ekleriz listeye sonra random bir sekilde seceriz
evet onu diyorum.
Egzersiz yapmak için iyi ama Python’da standard library’de de var:
import random
liste = [1, 2]
weights = [0.8, 0.2]
print(random.choices(liste, weights))
1000 kere çalıştırırsanız ~800’ünde 1 gelir.
Cevabı @anon18277073 vermiş, ben de bir örnek vereyim:
>>> import random
>>> random.choices([1, 2, 3, 4], # rastegele eleman seçeceğimiz dizi
weights = [1, 2, 4, 8], # sırasıyla her elemanın seçilme olasılığı, göreceli olarak. yani 4 sayısının çıkma olasılığı 1 sayısının çıkma olasalığından 8 kat fazla (8/1)
)
[4]
>>>
(O da benden birkaç saniye önce örnek attı.)
Metod random modülüne random modülü de standart libde
bunun icin hazir bir sey bulundugunu bilmiyordum.ogrenmis oldum @anon18277073 tesekkurler
Built in degil bu standart libdeki random modulunun bir fonksiyonu
Mesela tkinter da standsrt libde ama bazi linux distrolarinda default gelmiyor
Haklısınız, düzelttim, teşekkürler
Hatta Yaziyim:
def myfunc(liste,oran):
import random # boylece bu fonksiyonu kullanmak icin randomu ayrica import etmek gerekmiyecek(localda olmasina dikkat)
yeni = []
for i in range(len(liste)):
for j in range(oran[i]):
yeni.append(liste[i])
return random.choices(yeni) # burada isteginize gore sadece listeyide dondure bilirsiniz
myfunc([1,2,3,4],[10,0,80,10])
orjinal listenin uzerinde degisiklik yapmamasina dikkat.boyle daha ise yarar olacagi icin orjinal listenin uzerinde degisiklik yapmadim.