Merhaba arkadaşlar öncelikle python öğrenmeye çalışıyorum. Belirlediğim aralıkta rastgele 6 sayı üreten bir şey yazdım. Ancak bazen üretilen 6 sayı içinde birbirinin aynısı olanlar oluyor. Üretilen 6 sayının da birbirinden farklı olması için ne yapmam lazım. Bakar mısınız?
Merhaba.
Bunun doğrudan bir yolu olduğunu sanmıyorum. Bir döngü içinde üretilen rastgele sayıları öncekiler ile karşılaştırıp, eğer daha önce üretilen bir sayı ise tekrar üretilmesini sağlayabilirsiniz. Bunun için bir while
döngüsü daha uygun olacaktır. Döngünün şartını 6 sayı üretilmiş olması olarak belirtebilirsiniz. Döngü duruma göre 6 seferde sonlanabilir de, sonsuza kadar sürebilir de. Rastgeleliğin garipliği.
İyi çalışmalar.
Random modülünü döngünün içinde içe aktarırsanız her seferinde tekrar içe aktarılır. O yüzden döngü dışından aktarın.
Teşekkürler, denedim kodları ancak yine 6 sayı içinde aynı sayıdan birden fazla çıkabiliyor.
Merhaba, yapmak istediğiniz için farklı yollar deneyebilirsiniz.
- Mesela kümeleri kullanabilirsiniz:
from random import randint
sayilar = set()
while len(sayilar) < 6:
sayilar.add(randint(1,49))
print(sayilar)
- Listeleri veya demetleri if deyimiyle birlikte kullanabilirsiniz:
from random import randint
sayilar = [] # Liste kullanmak için bunu seçin.
# sayilar = () # Demet kullanmak için de bunu seçin.
while len(sayilar) < 6:
sayi = randint(1,49)
if sayi not in sayilar:
sayilar.append(sayi) # Listeye elemanı ekleyin.
# sayilar += sayi, # Demete elemanı ekleyin.
print(sayilar)
import random
liste = range(1,50)
random.sample(liste,6)
[49, 8, 33, 43, 22, 11]
Merhaba bu kod işinizi görür burada 1 ile 100 arasında yaptım siz istediğiniz gibi değiştirin ayrıca bu kod doğrudan bu şekilde çalışırsa bir anlam ifade etmez listede farklı sayıların olduğunu yani listenin dolu olduğunu üretilen sayının ise listedeki sayılardan farklı bir sayı olduğu varsayılarak yapıldı.
liste = []
while True:
rSayi = randint(1,100)
if rSayi in liste:
continue
else:
liste.append(rSayi)
break
Böyle de olur:
import random
liste=[]
while len(liste)<6:
a= random.randint(1,50)
if a not in liste:
liste.append(a)
liste.sort()
print(liste)
import random as r
l=[r.randrange(6) for i in range(6)]
print(set(l))
#basit sekilde boyle
def rasgele_uret(n):
l=[r.randrange(n) for i in range(n)]
return set(l)
print(rasgele_uret(6))
#ama burada, bu örnek icin üretilen sayılar aynıysa set ile üretilen aynı sayılar silindiği için 6 aralıkta üretilmeyecek, bunun icin
def rasgele_uret(n, m):
#n tane sayı, m araliginda
l=[r.randrange(m) for i in range(n)]
if n-len(set(l))>0:
return rasgele_uret(n, m)
else:
return l
print(rasgele_uret(5, 6))
Öz yinelemelilerin önemi
Önemli değil. Mucuk.
import random
liste = [i for i in range(1,50)]
random.shuffle(liste)
sayilar = liste[0:6]
sayilar.sort()
print(sayilar)
Böyle de yapabilirsin.
Madem kodu kısaltabildiğimiz kadar kısaltıyoruz
def rasgele_uret(n, m):
l=[r.randrange(m) for i in range(n)]
if n-len(set(l))>0:
return rasgele_uret(n, m)
return l
print(rasgele_uret(n,m))
from random import randint, shuffle
def sayi_uret(x, y, z, ris=[]):
while len(ris) != z:
ris = list(set(ris + [randint(x, y)]))
shuffle(ris)
return ris
x → rastgele sayı aralığının başlangıç noktası.
y → rastgele sayı aralığının bitiş noktası.
z → üretilecek liste için beklenen uzunluk.
ris → başlangıç listesi.
for n in range(5):
print(sayi_uret(1, 7, 6))
[1, 5, 4, 2, 6, 7]
[2, 5, 4, 7, 3, 6]
[2, 4, 6, 3, 7, 5]
[2, 1, 7, 3, 6, 5]
[5, 4, 1, 7, 6, 3]
for n in range(5):
print(sayi_uret(1, 100, 3, [1, 2]))
[47, 1, 2]
[1, 2, 15]
[74, 1, 2]
[1, 48, 2]
[1, 7, 2]
Fonksiyonda çok fazla parametre var benimki hala daha iyi. :d
Aralıklı hali
def rasgele_uret(n, m_i, m_f):
l=[r.randrange(m_i, m_f) for i in range(n)]
if n-len(set(l))>0:
return rasgele_uret(n, m_i, m_f)
return l
print(rasgele_uret(5, 9, 16))
#5 tane sayı üretir, 9 ile 16 arasında
Alın daha da kısalttım sizin için
def rasgele_uret(n, m_i, m_f):
l=[r.randrange(m_i, m_f) for i in range(n)]
return rasgele_uret(n, m_i, m_f) if n-len(set(l))>0 else l
Deneyin
print(rasgele_uret(5, 9, 16))
#5 tane sayı üretir, 9 ile 16 arasında
Bunun için oluşturduğun random atılan sayıyı listeden .remove komutu ile çıkarabilirsiniz:
import random
while True:
liste = list(range(1,49))
a = input("Sayı gir:")
if a == "1":
for i in range(6):
s = random.choice(liste)
print(s)
liste.remove(s)
Şimdi asla aynı for döngüsü içinde aynı sayıları almazsın
Yardımcı olduysa altına yazabilirsin…