C' De Diziye Random Farklı Sayılar Atamak (Yardım)
-
Arkadaşlar elimizde hepsi int ve a[4] ,b[4], c[4] ,d[4] olmak üzere toplamda 16 tane sayı var .Bende bunların hepsine 1 den 16 ya kadar random olarak birer sayı atamak istiyorum ancak önemli nokta bunlara atadığım sayıların eşit olmaması yani son sayı atandığında totalde bütün sayıların farklı olması.
Bunu nasıl sağlayabilirim.Bir algoritma yazıyorum bu şekilde olmadığı zaman programın saatlerce belki günlerce çalışması gerekicek.
-
Bir değişken daha tanımla ya da bir dizi. Bu değişkenin içini 1'den 16'ya kadar sırasıyla sayıları doldur. Random değerini sürekli olarak bu son tanımladığımız değişkenin içerdiği sayı miktarı ile çağır. Daha sonra çağrılmış olan değeri ise sil. 10 11 gibi çift haneli sayılarda problem çıkacağından hex kullanabilirsin. C bilmiyorum fakat şöyle örnek verebilirim;
s16="0123456789ABCDEF";
s16.lenght //<=1'den 16'ya kadar sayılarımızı içeren değişkenin uzunluğunu veren komudumuz
x=random(s16.lenght);
a[] = Math(s16[x]+1); //+1 yapıyorum çünkü hex'te F değeri 15'e karşılık gelir, 0 değerinide bulunmakta. 0 değil bize en az 1 gerekli olduğundan sürekli +1 yapmalıyız
//b[], c[], d[] dizilerinede atama yapılmalı her biri 4 değer alacak çünkü. Küçük bir sayaç ve if case ise çözersin bu noktayı
s16=s16.replace(s16[x],''); //Çekmiş olduğumuz değeri silelim
//atamalar tamamlandıktan sonra döngüden çıkalım.
-
Bunu C ye aktarmak biraz problem işte hocam, yinede sağol deneyeceğim bakalım
-
up?
-
http://www.tahribat.com/Forum-C-Diziler-Hakkinda-Ufak-Bir-Soru-128447/
-
selam, sordugun dogrultuda bir algoritma yazdim, ama cok iyi oldugu soylenemez random fonkisyonundan oturu yaklasik 25 saniyede sonuc veriyor..artik kod optimizasyonunu sen yaparsin diye dusunuyorum, kolay gelsin
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <stdbool.h>
#define max 16
int random16();
int main(void) {
int a[4], b[4], c[4], d[4], rd[max];
int i, j, random;
bool found = false;
for (i=0; i<max; i++) {
random = random16();
for (j=0; j<i; j++) {
if (random == rd[j]){
found = true;
break;
}
}
if (found) {
i--;
found = false;
}
else
rd[i] = random;
}
for (i=0; i<max; i++) {
if (i<4)
a[i] = rd[i];
else if (i<8)
b[i-4] = rd[i];
else if (i<12)
c[i-8] = rd[i];
else
d[i-12] = rd[i];
}
for (i=0; i<4; i++) {
printf("%d %d %d %d\n", a[i],b[i],c[i],d[i]);
}
return EXIT_SUCCESS;
}
int random16() {
srand((unsigned int) time(0) + getpid());
srand(rand());
int r = max * (rand() / (RAND_MAX + 1.0));
return r + 1;
} -
hocam bu işlerde en temiz yöntem keyleri değiştirmektir..
tek dizi üzerinden anlatayım.. :)
a[16] = { 0, 1 ,2, 3,4,...};
diye atadığını varsay...
sonra random olarak 0 ile 16 arasında bi 2 sayı üret,
daha sonra bu indexlere sahip sayıları yer değiştir..
mesela 13, ile 8 geldi
a[13] ile a[8] in değerlerini değiştir....
Bu işlemi döngü ile bikaç kez tekrarla..
En hızlı ve ekonomik çözüm budur :)
yoksa unique random sayı üretmek meşakkatli iş..
-
NmC bunu yazdı:
-----------------------------
hocam bu işlerde en temiz yöntem keyleri değiştirmektir..
tek dizi üzerinden anlatayım.. :)
a[16] = { 0, 1 ,2, 3,4,...};
diye atadığını varsay...
sonra random olarak 0 ile 16 arasında bi 2 sayı üret,
daha sonra bu indexlere sahip sayıları yer değiştir..
mesela 13, ile 8 geldi
a[13] ile a[8] in değerlerini değiştir....
Bu işlemi döngü ile bikaç kez tekrarla..
En hızlı ve ekonomik çözüm budur :)
yoksa unique random sayı üretmek meşakkatli iş..
-----------------------------yine verim yok 0-16 arasında ürettiğin sayılar sürekli birbirini değiştiricektir..
-
anubisx bunu yazdı:
-----------------------------
NmC bunu yazdı:
-----------------------------
hocam bu işlerde en temiz yöntem keyleri değiştirmektir..
tek dizi üzerinden anlatayım.. :)
a[16] = { 0, 1 ,2, 3,4,...};
diye atadığını varsay...
sonra random olarak 0 ile 16 arasında bi 2 sayı üret,
daha sonra bu indexlere sahip sayıları yer değiştir..
mesela 13, ile 8 geldi
a[13] ile a[8] in değerlerini değiştir....
Bu işlemi döngü ile bikaç kez tekrarla..
En hızlı ve ekonomik çözüm budur :)
yoksa unique random sayı üretmek meşakkatli iş..
-----------------------------yine verim yok 0-16 arasında ürettiğin sayılar sürekli birbirini değiştiricektir
-----------------------------Nasıl yok hacı :)
4-5 tur döndükten sonra zaten karman çorman olacaktır o seri.. while'in de 5 tur dönmesi mili saniye mertebelerinde olacak..
Hem hızlı hem temiz.. :)
-
Önce 1 kaynak dizi oluştur sıralı olsun farketmez 1 den 16 ya kadar
sonra random olarak bu diziden 4erli seçimler yaparak alt kümeleri oluştur...
Daha önce benzeri bir konu açılmıştı...
Ya da arkadaşın dediği gibi bir karıştırma prosedürü yaz... kaynak diziyi "karıştır" 16 kere karıştır ( teorik oalrak karışıma uğramamış eleman olabilir ama bu çok düşük bir olasılık , ama bir tombala çekme simülasyonu açısından bakarsan etik bir sorun vardır) sonra bu diziden istedğin şekilde 4 elemanlı alt küme oluştur...
