[linux-programlama] Re: yuzdeli rastgele sayi..

---------

From: Armish (armish@linux-sevenler.de)
Date: Mon 08 Mar 2004 - 16:02:57 EST

  • Next message: Armish: "[linux-programlama] Re: yuzdeli rastgele sayi.."

    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


  • Next message: Armish: "[linux-programlama] Re: yuzdeli rastgele sayi.."

    ---------

    Bu arsiv hypermail 2.1.6 tarafindan uretilmistir.