Rastgele Sayı Üretme!

Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

Necdet

Moderatör
Yönetici
Katılım
4 Haziran 2005
Mesajlar
15,233
Excel Vers. ve Dili
Ofis 365 Türkçe
Merhabalar,

Rastgele sayı üretme konusunda xl nin bir sıkıntısı var.
O da hep aynı sayıları üretir olması.

Örneğin Sayın leumruk'un eklediği dosyada Hücrelerin yerlerini değiştir bölümünde 2 kere çalıştırdığımda aynı sonuca ulaştım (önce çalıştırdım, sonra kapatıp açıp tekrar çalıştırdım).

Kod:
ALİ MEHMET FİKRET NESİL MAHMUT
NESİL FİKRET MEHMET ALİ MAHMUT
NESİL ALİ FİKRET MAHMUT MEHMET
MAHMUT ALİ MEHMET FİKRET NESİL
ALİ FİKRET MEHMET NESİL MAHMUT
MAHMUT FİKRET MEHMET NESİL ALİ
MAHMUT NESİL ALİ FİKRET MEHMET
ALİ MEHMET MAHMUT FİKRET NESİL
FİKRET NESİL MEHMET ALİ MAHMUT
MEHMET NESİL MAHMUT FİKRET ALİ
 
Katılım
15 Haziran 2006
Mesajlar
3,704
Excel Vers. ve Dili
Excel 2003, 2007, 2010 (TR)
Rastgele sayı üretme konusunda xl nin bir sıkıntısı var.
O da hep aynı sayıları üretir olması.
Necdet bey,

Rnd() fonksiyonunun, hep aynı sayıları üretmesi doğaldır. Kodun her çalışmasında farklı sayılar ve/veya seçimlerle karşılaşmak istiyorsanız, bahis konusu kodların herbirinin ilk satırına Randomize komutunu veriniz (ilk satıra sadece Randomize yazınız) ve kodları tekrar çalıştırınız. Sonra da; sonucu gözlemleyiniz.
 

Necdet

Moderatör
Yönetici
Katılım
4 Haziran 2005
Mesajlar
15,233
Excel Vers. ve Dili
Ofis 365 Türkçe
Randomize yi yeni öğrendim. Çaktırmadan birşey öğrenmiş oldum, sağolun Ferhat Bey :)
 
Katılım
2 Mart 2005
Mesajlar
2,960
Excel Vers. ve Dili
ev: Ofis 2007- Win Xp
iş: Ofis 2010- Win Vista
Syn. hsayar,
Teşekkürler. Kodlar muhteşem...Ellerinize sağlık. Devamını bekliyoruz.

Riaca ederim sn leumruk.
aslında benim yaptığım bir şey yok teşekkürler recep ipek hocama, onun bizlere kazandırdığı UniqueRandomNumbers üzerinden küçük değişkliklerle ürettiğim çözümler.

15 ve 17 mesajdaki kodları içeren dosya ektedir.
 

Ekli dosyalar

Son düzenleme:
Katılım
25 Nisan 2007
Mesajlar
459
Excel Vers. ve Dili
2007
Sn.Taruz

Bu fırtına değil, resmen kasırga olmuş :)

Hem 50 tane olacak, hem pozitif veya negatif olacak, üstüne üstlük toplamları +30 olacak ... Vallahi, Mars bile bundan daha ağır koşullarda oluşmamıştır ... Sonucu veren sayıları bulma ihtimali de -bizim PC'lerde- sanırım, evrim süresini aşar :)

Sevgiler ...

Bence "Algoritmayı Anlamak" adına güzel bir soru olmuş.
Bazen Fırtınaya karşı durmaktansa çevresini dolaşmak daha kolaydır.
Yada kılıcı kınından çıkartmak yerine kını kılıçtan çıkartmak!

Bir algoritmayı modelleyebilmek için, onu yeterince anlamak ve kullanacağımız Matematik ve kod() yapılarını seçmemiz gerekir.

Soruyu tekrar ve daha anlaşılır biçimde sorarsak cevap bize daha basit gelebilir.

Kodlar, Programlamanın alfabesi gibidir, onları öğrenmek konuşmaya yetmez. Ki amacımız güzel bi edebi eser ise, konuşmaktan da fazlası gerekir.

Bu genel ve sıkıcı anlatıma soruya dönerek ara vermek istiyorum ;)

Ama tüm arkadaşlara tavsiyem, programlamayı kitaplardan öğrenmeleridir. Bu benim nacizane tavsiyemdir. Bir şey bildiğimden değildir. Yanlış anlaşılmasın.

Bu sorunun algoritmasını şu şekilde kurdum;

1. Döngüye başlamadan önce değeri -4 olan bir değişkeni; rastgele aralıklarla 50 kere arttır.
2. Bu sayıları dizi() adlı diziye aktar
3. Eğer dizi() dizisinin 50.ci değeri +4 değerinden büyükse 1 nci adıma geri dön.
4. Eğer dizi() dizisinin toplamı 0'dan küçük veya 30'dan büyükse 1 nci adıma geri dön.

---------

*** 1.nci adımda kullandığım yöntem Birbirinden farklı 50 tane sayı üretir. Sayı ufak aralıklarla arttığı için en küçüğü en fazla -4 'dür. Ve hiçbiri kesinlikle birbirine eşit değildir.

5. Bu aşamaya geçebildiysek sayımız -4 ile +4 arasında ve toplamı 30'dan küçük bir dizimiz var.

**** Toplamı 30'a nasıl getireceğiz?

6. Toplam 30'dan küçükse dizinin tüm elemanlarını 0,01 arttır. Tabi bu arttırma işlemi için 1'den 50'ye kadar bir döngü kurup tüm değerleri 0,01 arttırıyoruz. Bu arada da toplam 30 olursa Döngüden çıkıyoruz.
7. Son değer LİMİT değere ulaştıysa (50.nci eleman için +4 değeri), bundan sonra onu arttırma ve arttırma döngülerini bir önceki elemana kadar yap.
8. Toplam 30 olana ve son değer LİMİT değere ulaşıncaya kadar döngüye devam et ve toplam 30 olunca döngüden çık.

**** Bu aşamada doğru döngü kurmayı bilmeliyiz, Arttırma işleminde her elemanın bir kez 0,01 değerinde arttırdığımızda 50 eleman için toplam değeri 0,5 arttırmış oluruz.
Diyelimki 5. Aşamada dizimizin toplam değeri 12,05 olsun demekki 30 değerine ulaşmak için; 17,95 arttırma yapmamız gerekiyor, buda her elemanı 0,01 değerinde
tekrar tekrar arttırarak 35 kez arttırmak demek. Buda her elemana 0,35 değeri eklemek demek. Tabi ki bu işlemi yaparken son elemanları +4 değerinin üstünde çıkartabiliriz.
Bunu önlemek için kuracağımız iç içe döngüde eğer son eleman, kendisine ait limit değere ulaşırsa (50.eleman için +4, 49.eleman için eğer elli +4 ise, kırkdöküz maksimum 3,99 olur. Bu şekilde iç içe döngü ve LİMİT değeri hesaplayan matematik formülü ile ARTTIRMA işlemini sonuçlandırdım.

Bu aşamada kodu incelerseniz daha iyi anlayacağınızı umuyorum. Örnek deneme olarak yazıldığı için dağınıktır.

Kod:
Sub rastgele()
Columns(1).Clear
[b1].Formula = "=sum(a1:a50)"
Randomize
Dim dizi(51) As Double
toplam = 0

Do While Not (toplam > 0 And toplam <= 30 And dizi(50) <= 4)
sayi = -4
toplam = 0
For n = 1 To 50

aralik = Round(Rnd() * Rnd() * 0.5 + 0.01, 2)
sayi = Round(sayi + aralik, 2)
If sayi = 0 Then sayi = Round(sayi + 0.01, 2)
dizi(n) = sayi
toplam = Round(toplam + sayi, 2)
Next

Loop


' arttirma

fark = Round(30 - toplam, 2)

For nn = 50 To 1 Step -1
Do While dizi(nn) < 4 - (0.01 * (50 - nn + 2))
For n = 1 To nn
dizi(n) = Round(dizi(n) + 0.01, 2)
toplam = Round(toplam + 0.01, 2)

If toplam >= 30 Then
GoTo cikis:
End If

Next
fark = 30 - toplam
Loop
Next nn


Exit Sub
cikis:

n = 1
Do While n < 51

sayi = Int((50 * Rnd) + 1)
Do While dizi(sayi) = 0
sayi = Int((50 * Rnd) + 1)
Loop

Cells(n, 1) = Round(dizi(sayi), 2)
Cells(n, 1).NumberFormat = "0.00"
dizi(sayi) = 0
n = n + 1

Loop

End Sub
 
Katılım
15 Haziran 2006
Mesajlar
3,704
Excel Vers. ve Dili
Excel 2003, 2007, 2010 (TR)
Merak ettim ... Program yazabilmek için; hangi kitapları okumamızı tavsiye edersiniz ... ?


.
 

leumruk

Uzman
Uzman
Katılım
15 Nisan 2007
Mesajlar
3,469
Excel Vers. ve Dili
Office 2010 & 2013 tr
Syn. xxcell,
Güzel bir mantık kurmuşsunuz, tebrik ederim; ancak 1-2 denemeden sonra exceli kilitliyor. İlgilenirseniz sevinirim.
 
Katılım
25 Nisan 2007
Mesajlar
459
Excel Vers. ve Dili
2007
Merak ettim ... Program yazabilmek için; hangi kitapları okumamızı tavsiye edersiniz ... ?
Yukarıda da belirtmeye çalıştığım gibi bu işte üstat değilim, sadece benim gibi hobi olarak uğraşan ve aynı yoldan yürümek isteyenler için fikirlerimi paylaştım.

Böyle arkadaşlara kitap isminden çok seviyesini tavsiye edebilirim, Teknik kitapların üç düzey seviyesi vardır. Başlangıç, Orta Düzey ve Profosyoneller İçin. Tavsiyem en az iki - üç adet Başlangıç Seviyesinde programcılık kitabı okumak. Ve kitapda verilen her örneği birebir tekrar etmektir. Aynı kitabı iki üç kez okuduktan sonra referans olarak saklamaktır. Ben 1990'larda toy yıllarımda başladığım için programcılık hobime (!) o yıllarda QBasic, Dbase, Clipper kitapları okudum. Hatta kelimesinden anlamadığım Assembler, C kitaplarım da mevcutdu. Adamlar Assembler ile hesap makinesi programlıyor, bayrak al, bayrak tut gibi komutları var ;) Temel C'de sadece 8 - 10 komut mevcut diye bilirim. İhtiyacın olan kodları kendin yazıyosun. 90'ların geyiği, C'de ekran temizleme komutu bile yok kendin yazman lazım. Sonra Algoritma Yapıları ile ilgili kitaplarım da vardı. Ayrıca abartısız onlarca excel kitabım oldu. M.T.Korkmazın Programlamaya giriş kitabı güzel bir referans kaynak. Favori kitabım, gerçek üstatların yazdığı Profosyonel Excel Çözümleri. Hüseyin Bey'in sitesi de satıyor. Çok zor anlayabiliyorum. Ama süper bir referans. Bir de bu site var tabi. Sağolsun Levent üstat'dan çok şey öğrendim. Haluk Bey'in yabancı kaynaklı örnekleri de lazım olduğunda bire bir kullanıyorum. CostControl arkadaşı ve siz değerli üstatları da takdir ediyorum. Bu Yazıyı yazdığımda tam adını hatırlayadığım (N ile başlıyor ;) ) bir üstat da fonksiyonlarda gerçek bir üstat, onun VBA geçiş süreci de yansıyor topiclere.


Syn. xxcell,
Güzel bir mantık kurmuşsunuz, tebrik ederim; ancak 1-2 denemeden sonra exceli kilitliyor. İlgilenirseniz sevinirim.
Kilitlemesine sebep olarak, cikis: kisminda dizi() dizisinin hücrelere aktarılmadan önce sırasının karıştırma işleminin hesaplamasından kaynaklanıyordur. Zira daha önce aktardığı dizi elamanı yerine başka bir değer ararken 1 ile 50 arasında sonsuz deneme yapıyor. 40 numaralı elemanı almıştım tekrar dene gibi.

cikis: kısmını değiştirirseniz sorunun düzeleceğini tahmin ediyorum.

cikis:

for n=1 to 50
cells(n,1)=dizi(n)
next

end sub

ayrıca fark isimli değişkenin hiç bir fonksiyonu yok fark = ile başlayan satırları da çıkartabilirsiniz ;)
 

leumruk

Uzman
Uzman
Katılım
15 Nisan 2007
Mesajlar
3,469
Excel Vers. ve Dili
Office 2010 & 2013 tr
Sayın xxcell,
Paylaşımınız için teşekkür ederim. Güzel bir çalışma.
 
Katılım
25 Nisan 2007
Mesajlar
459
Excel Vers. ve Dili
2007
Necdet bey,

Rnd() fonksiyonunun, hep aynı sayıları üretmesi doğaldır. Kodun her çalışmasında farklı sayılar ve/veya seçimlerle karşılaşmak istiyorsanız, bahis konusu kodların herbirinin ilk satırına Randomize komutunu veriniz (ilk satıra sadece Randomize yazınız) ve kodları tekrar çalıştırınız. Sonra da; sonucu gözlemleyiniz.

Hiçbirşey gerçekde rastlantı değildir, biz örnek sayımızın, deney araçlarımızın ve zamanımızın kısıtladığı kadar rastlantı sayarız. Bu sözde rastlantısallık durumuna pseudarandom denir.

Vbasic’te (ve birçok programda) Pseudarandom sayı üretmek için sistem saati referans alınır. Kod bloğumuzun başına RANDOMIZE kodunu yazarak , program her başlatıldığında sistem zamanı değişik olacağından rnd() ile üretilecek sayıları da değiştirmiş oluruz. Bu bize yeterince rastgele bir sayı verir.

Randomize komutu referans olarak, sistem saatini alır. Kod bir kere çalıştığında ve sözde rastlantısallık başlatıldıktan sonra aynı zaman aralığında işlem yapar. Bu arada rastgele sayılarımızı bir diziye aktarıp sabitlediğimizi düşünelim. Teorik olarak, yeterince iyi bir matematik formülü ile ilk elemanı tahmin edemesek bile ona göre üretilmiş diğer sayıları tahmin edebiliriz. Bu teoriye dayanarak, 90’larda bir hackerın bir kumar sitesinde pokerde kendine gelecek kağıtları hesaplayan bir program geliştirip siteyi yüzbinlerce dolar dolandırdığı ortaya çıktı.

Biz böyle yüksek güvenlik seviyeli kod geliştirmeyeceğimize göre bizim için bir sorun yok, yinede istersek randomize değerine başka değişkenler ekleyebiliriz. Örneğin, aktif sayfa isminin son harfinin ascii kodu, aktif hücrenin satır numarası, mousenin X konumu gibi,

Randomize ActiveCell.Row + asc(right(activesheet.name,1))

Dikkat ederseniz bulduğum sayılar yeterince rastlantısal değil ama bu konuya takılmamak gerek. Ben beyin fırtınamıza yararlı olduğunu düşündüğüm temel bir bilgi vermek istedim. Randomize yapmak fazlasıyla yeterli.

Bilginize.
 
Katılım
15 Haziran 2006
Mesajlar
3,704
Excel Vers. ve Dili
Excel 2003, 2007, 2010 (TR)
Yukarıda da belirtmeye çalıştığım gibi bu işte üstat değilim, sadece benim gibi hobi olarak uğraşan ve aynı yoldan yürümek isteyenler için fikirlerimi paylaştım.

Böyle arkadaşlara kitap isminden çok seviyesini tavsiye edebilirim, Teknik kitapların üç düzey seviyesi vardır. Başlangıç, Orta Düzey ve Profosyoneller İçin. Tavsiyem en az iki - üç adet Başlangıç Seviyesinde programcılık kitabı okumak. Ve kitapda verilen her örneği birebir tekrar etmektir. Aynı kitabı iki üç kez okuduktan sonra referans olarak saklamaktır. Ben 1990'larda toy yıllarımda başladığım için programcılık hobime (!) o yıllarda QBasic, Dbase, Clipper kitapları okudum. Hatta kelimesinden anlamadığım Assembler, C kitaplarım da mevcutdu. Adamlar Assembler ile hesap makinesi programlıyor, bayrak al, bayrak tut gibi komutları var ;) Temel C'de sadece 8 - 10 komut mevcut diye bilirim. İhtiyacın olan kodları kendin yazıyosun. 90'ların geyiği, C'de ekran temizleme komutu bile yok kendin yazman lazım. Sonra Algoritma Yapıları ile ilgili kitaplarım da vardı. Ayrıca abartısız onlarca excel kitabım oldu. M.T.Korkmazın Programlamaya giriş kitabı güzel bir referans kaynak. Favori kitabım, gerçek üstatların yazdığı Profosyonel Excel Çözümleri. Hüseyin Bey'in sitesi de satıyor. Çok zor anlayabiliyorum. Ama süper bir referans. Bir de bu site var tabi. Sağolsun Levent üstat'dan çok şey öğrendim. Haluk Bey'in yabancı kaynaklı örnekleri de lazım olduğunda bire bir kullanıyorum. CostControl arkadaşı ve siz değerli üstatları da takdir ediyorum. Bu Yazıyı yazdığımda tam adını hatırlayadığım (N ile başlıyor ;) ) bir üstat da fonksiyonlarda gerçek bir üstat, onun VBA geçiş süreci de yansıyor topiclere.
Diğer arkadaşları bilmem ama, -şahsen- beni aydınlattığınız için teşekkür ederim !...

Benim düşüncem ise şu şekildedir : Bir kütüphane dolusu kitap hatim edip, halen daha iki satır kod yazamayanlardan olmayınız ...

Eğer yazmazsanız, ne kadar okuduğunuzun hiçbir anlamı yoktur.

Pratik; teoriden önce gelmelidir.

Çocukken; yemek yemeyi, kaşık/çatal tutmayı öğrenmek için kitap okumak zorunda değildiniz. Ama şu an yemek yiyebiliyorsunuz.

Sonradan (büyüyünce) çıktı bu adab-ı muhaşeret ... O zaman yemek yemenin kuralları olduğunu, bahsedilen kitaplardan öğrendiniz ... Neyi yanlış neyi doğru yaptığınızı anladınız ...

VBA kodunu yazarken de; bundan farklı bir mantık kurulmamasına gerektiğine inanıyorum.
 

leumruk

Uzman
Uzman
Katılım
15 Nisan 2007
Mesajlar
3,469
Excel Vers. ve Dili
Office 2010 & 2013 tr
Bu dosyayı "Kombinasyon" başlığı altında hazırlamıştım. Hücre karıştırmayla ilgili olduğu için buraya ekliyorum.
 

Ekli dosyalar

Katılım
25 Nisan 2007
Mesajlar
459
Excel Vers. ve Dili
2007
slm arkadaşlar
xxcell arkadaşımız
"2 numaralı soru bana Tombalayı anımsattı." demiş ve
"sayfa ustunde tombala ornegi" dosyasını eklemişsiniz
bu çok hoşuma gitti ve bunu geliştirmek istedim ama düşündüğümü başaramadım
tombaladaki gibi bir kart yani sayfa hazırlayarak burada bütün rakamları yazdım
ve adım adım tuşa basıp taş çep deyince çıkan taşların bu kart üzerinde belirtilmesini
istemiştim
yani örneğin taş çek ve çıkan sayı 50 olsun
bu kart üzerindeki 50 sayısı da kapanacak
malesef beceremedim
taş çekme sadace a1 hücresinde olmasaydı yapabilirdim
yani sırayla
1.taş çek=a1
2.taş çek=a2
3.taş çek=a3
gibi olsaydı çıkan bu sayıları görebildiğimiz için tablo üzerinde gösterebilirdim
ama hep aynı hücrede olunca bunu yapamadım, kod da yazamıyorum
bunun bir kolay yolu var mı
şimdiden teşekkürlerrr
Kod yazmadan olmaz, İşlerim yoğun olmasa bu samimiyetinize karşılık yazardım ama kendi adıma samimiyetinize teşekkür etmekle yetinebiliyorum. Saygılar.
 

Erdem Akdemir

Destek Ekibi
Destek Ekibi
Katılım
4 Mayıs 2007
Mesajlar
3,598
Excel Vers. ve Dili
2016 PRO TÜRKÇE-İNG. 64 BİT
Kod yazmadan olmaz, İşlerim yoğun olmasa bu samimiyetinize karşılık yazardım ama kendi adıma samimiyetinize teşekkür etmekle yetinebiliyorum. Saygılar.
daha az gez, insanlara yardım et burda:cekic:
 

leumruk

Uzman
Uzman
Katılım
15 Nisan 2007
Mesajlar
3,469
Excel Vers. ve Dili
Office 2010 & 2013 tr
Selamlar,
Syn. mavi674,
İstediğiniz gibi çekilen sayıları alt alta sıralayan bir kod hazırladım. 99'a kadar birbirinden farklı sayılar üretir. Sayıyı artırabilirsiniz veya azaltabilirsiniz.
Tabloya ekleme konusunda yardım alabilmek için örnek tabloyu ve açıklamayı eklemelisiniz.
 

Ekli dosyalar

Son düzenleme:

leumruk

Uzman
Uzman
Katılım
15 Nisan 2007
Mesajlar
3,469
Excel Vers. ve Dili
Office 2010 & 2013 tr
leumruk arkadaşım
yukarıdı vermiş olduğum tabloyu isterseniz giliştirebilirsiniz
Tablo güzel olmuş. Elinize sağlık. Sanırım bu tabloyu tombala torbası görevini üstlenmesi için yaptınız. Sadece kura çekimi için. Tablodaki sayıları rastgele oluşturarak ve bir kaç ekle tombala oyunu haline getirilebilir.
 

Muhammet Okumuş

Destek Ekibi
Destek Ekibi
Katılım
28 Eylül 2007
Mesajlar
3,968
Excel Vers. ve Dili
2013 Türkçe
Sub RASTGELE_SAYI_ÜRET_3()
Dim X As Byte, SAYI As Byte

Columns(1).ClearContents
For X = 1 To 100
BAŞLA: SAYI = Int((100 * Rnd) + 1)
If WorksheetFunction.CountIf(Columns(1), SAYI) > 0 Or SAYI = 0 Then GoTo BAŞLA
Cells(X, 1) = SAYI
Next
MsgBox "İşleminiz tamamlanmıştır.", vbInformation
End Sub

bu kod aynı anda 100'e kadar sayı üretiyor.benim istedğim her bastığımda bir sayı üretecek
 
Katılım
28 Kasım 2007
Mesajlar
919
Excel Vers. ve Dili
Office 2010 İngilizce
D1 ve D2 hücrelerine en küçük ve enbüyük değerleri girin

Sub rastgele()
Dim i As Integer
Dim bul As Range

Randomize

If Range("D1").Value < Range("D2") Then
MsgBox "D1 hücresinin değeri D2 hücresinden küçük olmamalı"
Exit Sub
ElseIf Range("D1").Value = "" Or Range("D2") = "" Then
MsgBox "Ama olmaz ki D1 ya da D2 Hücreleri boş olmaz"
Exit Sub
End If

Cells(1, 1).Value = Int((Range("D1") * Rnd) + 1)
For i = 2 To Range("D2")
Cells(i, 1).Value = Int((Range("D1") * Rnd) + 1)
For Each bul In Range("A1:A" & Cells(i - 1, 1).Row)
If Cells(i, 1).Value = bul.Value Then
Cells(i, 1).Value = Int((Range("D1") * Rnd) + 1)
End If
Next bul
Next i
End Sub
 
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...
Üst