C - Diziler Hakkında Ufak Bir Soru
-
Merhabalar. Örneğin 6 elemanlı bir diziye 1 ile 6 arasında random değer atarken, her elemanın farklı olmasını nasıl sağlayabilirim? Elemanın içindeki değerlere random değer atamada bir sorun yok ama her elemanın birbirinden farklı olmasını nasıl sağlayabilirim? şimdiden teşekkürler.
srand(time(NULL));
int A[6];
int i,j,yed;
for(i=0;i<6;i++)
A[i]=rand()%6+1;
for(j=0;j<6;j++)
for(i=0;i<6;i++)
}
//bubble sort
for(i=0;i<6;i++)
for(j=0;j<5;j++)
if(A[j+1]<A[j]){
yed=A[j+1];
A[j+1]=A[j];
A[j]=yed;
} -
bi dizi tanımla 6 elemanlı sonra hepsine index teki değerini at yani dizi[i]=i;
sonra dizideki elemanların yerini random olarak değiştir.şu şekilde
for(i=0;i<6;i++){
random=rand()%6;
tmp=dizi[random];
dizi[random]=dizi[i];
dizi[i]=tmp;
}
-
Hocam sanırım yanlışın var işe yaramadı. Yukarda verdiğim koda enjekte edebilirsen sevinirim ben yanlış kullandım belki de.
edit// jeton yeni düştü hocam eyvallah :)
-
en son oluşturduğun random elemanın mevcut dizide var olup olmadığını kontro eden bir prosedür yazmalısın..
Eğer var ise bu elemanı diziye eleman olarak kaydetmezsin..
Yok ise diziye eleman olarak kadedersin...
-
seretide'ın yöntemi ise akıllıca mantıklı ve ekonomik...
ancak mod anahtarını%5+1 şeklinde yapmak daha mı doğru olmaz mı?// Edit: olmaz :))
-
ltcelik bunu yazdı:
-----------------------------
seretide'ın yöntemi ise akıllıca mantıklı ve ekonomik...
ancak mod anahtarını%5+1 şeklinde yapmak daha mı doğru olmaz mı?
-----------------------------Evet hocam o şekilde düzenledim ben de. Dizi[0] şeklinde verceği için 0 dan başlayacak n-1 e kadar gidecek. Değerlerin içine atcağımız değer de dizi[i]=i+1 yapmak daha mantıklı çünkü seçceğim sayılar 1 den başlıyor. Tekrar teşekkürler seretide
-
yok yok olmaz eğer 1ve 6 dahil sayı istersek %6+1 yapmalı çünkü mod 6 da en büyüksayı 0-5 arası veriyor
dolayısıyla %6+1 yaptığımızda 1-6 aralığını verecektir ( eğer 1-6 kapalı aralığını istiyorsak )
-
ltcelik bunu yazdı:
-----------------------------
en son oluşturduğun random elemanın mevcut dizide var olup olmadığını kontro eden bir prosedür yazmalısın..
Eğer var ise bu elemanı diziye eleman olarak kaydetmezsin..
Yok ise diziye eleman olarak kadedersin...
-----------------------------Evet aynen öyle yapılır. Itcelik abinin bahsettiği prosedür de linearSearch olabilir.
-
Bu çeşit prblemlerde seretide'ni yöntemi daha akıllıca (ama benim yöntemimdeki eksikliği de hala barındırıyor )
Şöyle ki
random sayı üretici ile örneğin 1-99 arası elemanlardan oluşan bir dizi oluşturmak istediğimizde
bilgisayar kafadan bir sayı atacak ve bu sayı daha önce var üretilmiş mi diye kontrol edecek
ilk başlarda çok problem olmayacak ama seçebileceği sayılar azaldıkça bu sefer daha çok eski sayı üretecektir...
örneğin 97 tane sayıyı diziye yerleştirdi bir tek 27 ive 63 kaldı... bilgisayar bu sayıları üretene kadar - işimiz "şansa" ( ne garip çelişki değil mi) - belki de sonsuza kadar beklemek zorunda kalacığız...
seretide'ın yönteminde ise zaten var olan elemanların ( bir türlü üretilmeyen "27" ve "63" de dizinin elemnaları olarak mevcut) yerlerini şansa bağlı olarak değiştirdiğimizden döngünün sonsuz ıraksaması gibi bir sorunda ortaya çıkmayacaktır.. ancak bu sefer de seçmesi gereken eleman indislerini seçerken aynı sorun ortaya çıkıyor..
Bunu yerine şöyle düşünelim...
Bizim sıralı dizimiz sıarasıyla elemanlarından oluşsun...1,2,3..99 gibi ( üst üste tabaklar gibi)
Biz bu sıralı diziden -S[]- rasgele üreteteci ile bir eleman alalım ve sırasıyla R[] dizisine eleman olarak kaydedelim..
Ancak burada dikkat etmemiz gereken bir iki kritik nokta var..
Biz S dizisinden her eleman(ı) çekişimizde
1. eleman alış indisimize kayıtlı eleman S dizisi elemanlığından çıkar
2.ondan sonraki elemanlar tabaklar gibi birer indis küçük indise yerleşir ( yani dizi restore edilir)
3.Sdeki Eleman sayısı küçüleceği için rand anahtarı her defasında bir küçülür ( çünkü eleman sayısı bir eksilmiş olur, bunu yapmazsak olay uzayının yani olasılık sayısının dışına çıkmış oluruz ki bu önceden söylediğim gibi gereksiz ve teorik olarak sonsuz döngülere sebep olur)
algoritma basitce
N elemanlı sıralı S dizisini oluştur
xx
olay uzayını (U) Snin eleman sayısına eşitle (SE)
randomize nahtarını U ya ayarla, randomize sayı RS üret
R dizisine S dizisndeki RSinci elemanı eleman olarak kaydet
S dizisinin RS+1 inci den sonuncu elemnına kadar yeniden düzenle ve boyutlandır
tüm elemanlar yerleşinceye kadar tekrarla(N)
// Çünkü her eleman yerleştirmede aynen tombala çeker gibi , olay uzayımız ( eleman sayımız ) azalacağı için mutlaka torbadaki elemanladan birini seçmek durumında oduğumuz için yanlış eleman seçme gibi bir derdimiz de olmayacak ve sonsuza ıraksamış bir döngümüz de olmayacaktır...//
-
ltcelik bunu yazdı:
-----------------------------
en son oluşturduğun random elemanın mevcut dizide var olup olmadığını kontro eden bir prosedür yazmalısın..
Eğer var ise bu elemanı diziye eleman olarak kaydetmezsin..
Yok ise diziye eleman olarak kadedersin...
-----------------------------o algoritma ortalamada n^3 lük zamanda çalışıyor evet mantıklı ama kısa diziler için gayet tatbik edilebilir.
-
İtcelik hocam ugrasip uzunca yazmissin ama degdi cok mantikli bi algoritma ogrendm valla sayende cok tesekkurler
