From: Armish (armish@linux-sevenler.de)
Date: Mon 08 Mar 2004 - 16:02:57 EST
On Mon, 8 Mar 2004 22:09:08 +0200
Umut <php@kakalak.org> wrote:
Merhaba
> Aykut> merhaba..
> Aykut> kucuk bir porgram yapmaya calisiyorum ama icinden cikamadigim bir =
soru var..
> Aykut>=20
> Aykut> bir grup sayi arasindan rastgele birini secerken, secilecek sayila=
rin cikma olasiliklarini
> Aykut> yuzde uzerinden nasil belirliyeblilirim?
> Aykut>=20
> Aykut> mesela , 1den 10 kadar olan bir sayi grubundan 3 tane sayi sececeg=
im.
> Aykut> fakat her bir sayinin secilme olasiligi farkli olacak.
> Aykut> mesela 9 unki %10, 3=FCn %75 gibi..
> Aykut>=20
> Aykut> bu islem rastgelelik kavramiyla pek uyusmuyor ama yapilmasi gereke=
n bu..
> Aykut> programlama dili onemli degil..merak ettigim nasilbir mantik kurul=
masi gerektigi..
>=20
> Verdiginiz ornegi ele alalim:
> Eger 10 [0..9] tane sayiniz var ve ihtimalleri ifade etmek icin % yeterli=
diyelim ki.
>=20
> 0: %3
> 1: %10
> 2: %3
> 3: %30
> ...
>=20
> olsun. O halde siz 100'luk bir dizi olusturun ve degerlerini:
>=20
> 3 tanesini 0 ile
> secim[0]=3D0
> secim[1]=3D0
> secim[2]=3D0
>=20
> 10 tanesini 1 ile
> secim[3]=3D1
> secim[4]=3D1
>=20
> vs doldurun. Simdi random degiskeniniz ile 0..99 arasinda bir sayi secin,=
sectiginiz
> sayiya karsilik gelen dizi elemani sizin istediginiz oranlarda gelmis ola=
caktir.
>=20
> Az sayida secenek ve %'li ifadeler icin bu yontem gecerli olabilir.
>=20
Bu soruyu ilk okudugumda benim de aklima bu geldi ama daha sonra sunun daha=
mantikli oldugunu dusundum;
# include <stdio.h>
# include <stdlib.h>
# include <time.h>
=
=20
int rast(int nereden, int nereye, int ozel_sayi, int yuzdelik);
=
=20
int main() {
=
=20
printf("%d\n", rast(1, 10, 3, 75));
=
=20
return 0;
}
=
=20
int rast(int nereden, int nereye, int ozel_sayi, int yuzdelik) {
=
=20
srand( (unsigned int)time(NULL) );
=
=20
if( yuzdelik >=3D rand()%(101)+1 )
return ozel_sayi;
else {
int ozel_olmayan;
while( (ozel_olmayan =3D (rand()%(nereye-nereden)+nereden))=
=3D=3D ozel_sayi )
;
return ozel_olmayan;
}
=
=20
}
Aciklama dinlemek isteyenler icin;
rast() fonksiyonunda, iki tane rastegele secim kullandim. Ilkinde (if'li ki=
simda) [1,100] araliginda bir sayi secerek bunun istenilen yuzdelik dilimde=
n kucuk olup olmadigini karsilastirdim. Mesela yukaridaki ornekte main() fo=
nksiyonunda 75 olarak girdigimde, 100 sayi arasindan 75'e esit veya ondan k=
ucuk bir sayi secme olasiligi %75 olmus oluyor. Boylece ilk kademede % kism=
i hallediliyor. Eger bahsedilen sartlar uygunsa yuzdelik dilimin uygulanaca=
gi sayi fonksiyondan donduruluyor.=20
Eger sansimiz iyi gitmezse else kismindaki islemlere geciyoruz. Eger bu asa=
maya gelinmisse ozel_sayi'nin secilmemesi gerekir. Bu yuzden ozel_olmayan'a=
while dongusu ile ozel_sayi olamayan bir deger atiyoruz. Bu deger araligi =
da [nereden, nereye) - {ozel_sayi} seklinde. Bu sayi secildikten sonra fonk=
siyondan donduruluyor.=20
Umut Bey'in yazdiginda belki buyuk islemlerde (kendisinin de belirttigi gib=
i) sorunlar yasanabilir.
Umarim programda su an goremedigim bir mantik hatasi yoktur. Olsa da umarim=
dusundugum seyi aktarabilmisimdir.
Surc-i coding ettimse affola misali....=20
>=20
> saygilar.
> Umut
>=20
Kolay Gelsin
--=20
Arman (Armish) Aksoy
http://lfs.geleceklinux.org
http://www.linux-sevenler.de