Rastgele sayı üretme sorunu

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. :slight_smile:

İyi çalışmalar.

2 Beğeni

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.

Bu kodlar isini gorur umarim.
Random bir cok faktore bagli. O yuzden ygrasmayip bunu deneyebirsjn.

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.

  1. Mesela kümeleri kullanabilirsiniz:
from random import randint
sayilar = set() 
while len(sayilar) < 6:
    sayilar.add(randint(1,49))
print(sayilar)
  1. 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)
3 Beğeni

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))

:slight_smile:

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]
1 Beğeni

Fonksiyonda çok fazla parametre var benimki hala daha iyi. :smiley: :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
1 Beğeni

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
2 Beğeni

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 :slight_smile:
Yardımcı olduysa altına yazabilirsin…