ben program her calistirildiginda rasgele sayi ureten
bir funktion ariyorum.
rand() funtionunu denedim. Yapamadim. yardimlariniz icin tesekkurler..
Volkan Uzun
05/02/2003, 21:25
deminden beri yaziyorum ama cevap yaz deyince problem veriyor. tekrar deneyim:
random generaor i initialize etmen gerekiyor. srand ile yapabilirsin.
msdn den bir ornek :
srand( (unsigned)time( NULL ) );
sonra rand cagirabilirsin
yani rand() tek basina calismiyor..
cevab icin tesekkurler..
yav kanka bende yeniyim ama once bi randomize() yazman gerekiyo herhalde program blogunun basina.bi ornek var elimde
#include <stdlib.h>
main()
{
int a[10][10];
int i, j;
randomize();
for (i = 0; i<10; i++)
for (j = 0; j<10; j++)
a[i][j] = (rand() % 100) - 20;
for (i = 0; i<10; i++)
for (j = 0; j<10; j++)
if (a[i][j] < 0)
goto bulundu;
printf("Sıfırdan küçük sayı yok\n");
goto son;
bulundu:
printf("Sayının konumu ve değeri (%d, %d) = %d \n",i, j, a[i][j]);
son:
return 0;
}
saygılar.
acehreli
14/02/2003, 21:26
Öncelikle bir kaç ekleme ve düzeltme:
- mudavim, sorun tam anlaşılamıyor çünkü "rand() funtionunu denedim. Yapamadim." açık değil. Örneğin sanal_programci "random generaor i initialize etmen gerekiyor. srand ile yapabilirsin." demiş. Bu yanıt, senin sorunu "rand()'ın ürettiği sayılar rasgele olmuyor" şeklinde anlarsak doğru.
- sanal_programci, time'ın duyarlığı saniye mertebesindedir. Bu durumda, srand((unsigned)time(NULL)) kullanan bir program eğer aynı saniye içinde birden fazla kere çalıştırılırsa, aynı sayı dizisini üretir. Yani o kadar da rasgele değil :)
- Fobus, standart C'de randomize() diye bir işlev yoktur. Onun için ben aşağıda srand()'ı kullanacağım. Hem de sanal_programci gibi time()'ı kullanarak :)
- Fobus, C'ye yeni başladığını söylemiştin; gönderdiğin programa bakarak daha önceden basic kullandığını tahmin edebiliyorum :) C gibi düşünüp yazabilmek için, öncelikle 'goto'dan uzak durmanı öneririm. Yazdığın programı daha bir C kafası ile örneğin şöyle yazabilirdik:
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
void sayilariDoldur(int a[10][10])
{
int i, j;
for (i = 0; i<10; i++)
for (j = 0; j<10; j++)
a[i][j] = (rand() % 100) - 20;
}
int satirdaEksiSayiBul(int satir[10])
{
int j;
for (j = 0; j<10; j++)
if (satir[j] < 0)
break;
return j;
}
struct Yer
{
int satir;
int sutun;
};
typedef struct Yer Yer;
Yer dizideEksiSayiBul(int a[10][10])
{
/*
Baştan bulunmadığını varsayalım.
(Satir numarası olarak 10, eksi sayı
bulunmadığı anlamına gelsin.)
*/
Yer yer = { 10, 10 };
int i;
for (i = 0; i<10; i++)
{
int sutun = satirdaEksiSayiBul(a[i]);
if (sutun < 10)
{
/* bulundu */
yer.satir = i;
yer.sutun = sutun;
break;
}
}
return yer;
}
int main()
{
int a[10][10];
Yer yer;
srand(time(NULL));
sayilariDoldur(a);
yer = dizideEksiSayiBul(a);
if (yer.satir < 10)
{
printf("Sayının konumu ve değeri (%d, %d) = %d \n",
yer.satir, yer.sutun,
a[yer.satir][yer.sutun]);
}
else
{
printf("Sıfırdan küçük sayı yok\n");
}
return 0;
}
Kodda fazla değişiklik yapmak istemediğim için kullandığın 'sihirli sayı' 10'u da olduğu gibi bıraktım. Onları da mutlaka sabitler olarak tanımlaman çok iyi olur:
#define TOPLAM_SATIR 10
#define TOPLAM_SUTUN 10
Ondan sonra kod içindeki bütün 10'ları bunlardan doğru olanıyla değiştirirsin.
Aslında şimdi bakınca benim programım seninkinden çok daha karmaşık ve gereksizce uzun gibi gözükebilir, ama değil. :) Programları böyle küçük işlevlere ayırarak yazmaya alışmak, daha büyük projelerde çok büyük yararlar sağlar.
Şimdi gelelim rasgele sayı elde etmek için hemen hemen herkesin kullandığı 'rand() % N' kullanımına... :)
Şu programı kendi ortamınızda çalıştırıp sonucun sizde de bendeki gibi garip mi çıktığına bir bakar mısınız... Yaptığım şey, [0, ARALIK) aralığında sayilar üretip o sayilardan kaç tanesinin bu aralığın birinci yarısına, kaç tanesinin de ikinci yarısına düştüklerini saymak.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/*
rand, 0 ile RAND_MAX arasında bir sayı döndürür.
Bu örnek programda 0 ile ARALIK arasındaki
sayılarla ilgileneceğim. ARALIK'ın değerini
oldukça yüksek seçiyorum...
(RAND_MAX'ın değeri her ortamda başka olabildiği
için, burada sabit bir değer kullanmadım.)
*/
#define ARALIK (RAND_MAX / 3 * 2)
#define ARALIK_ORTASI (ARALIK / 2)
/* Bu kadar rasgele sayı üreteceğiz */
#define TOPLAM_SAYI 100000
int main()
{
int i;
/* Aralığın birinci yarısına düşen sayı adedi */
int birinci = 0;
/* Aralığın ikinci yarısına düşen sayı adedi */
int ikinci = 0;
srand(time(0));
for (i = 0; i != TOPLAM_SAYI; ++i)
{
/* BUNU YAPMAYIN!!! :) */
int sayi = rand() % ARALIK;
/*
Şimdi elimizde [0, ARALIK) aralığında
bir sayı var. Bakalım bu sayı o aralığın
hangi yarısındaymış...
*/
if (sayi < ARALIK_ORTASI)
{
++birinci;
}
else
{
++ikinci;
}
}
printf("Yaptığım derin araştırmalarım sonuçlandı!\n");
printf("Bu ortamda RAND_MAX'ın değeri: %d\n", RAND_MAX);
printf("%d tane sayı ürettik\n", TOPLAM_SAYI);
printf("%d tanesi [%10d, %10d) aralığına,\n",
birinci, 0, ARALIK_ORTASI);
printf("%d tanesi [%10d, %10d) aralığına düştü.\n",
ikinci, ARALIK_ORTASI + 1, ARALIK);
printf("Ne de güzelmiş rasgele sayılar... :)\n");
return 0;
}
Programı çalıştırmaya üşenenler için benim ortamımda çıkan bir sonucu yazayım:
66706 tanesi [ 0, 715827882) aralığına,
33294 tanesi [ 715827883, 1431655764) aralığına düştü.
Demek ki, rasgele sayı üretmek için 'rand() % N' yöntemini kullanmamak gerekiyor :)
Ali
Forum Yazılımı : vBulletin v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.