Duyuruyu Kapat
Facebook Gözat
Twitter Gözat

C de rasgele sayi

Konu, 'C / C++' kısmında mudavim tarafından paylaşıldı.

  1. mudavim

    mudavim Yeni Üye

    Kayıt:
    12 Ocak 2003
    Mesajlar:
    6
    Beğenilen Mesajlar:
    0
    ben program her calistirildiginda rasgele sayi ureten
    bir funktion ariyorum.
    rand() funtionunu denedim. Yapamadim. yardimlariniz icin tesekkurler..
     
  2. Volkan Uzun

    Volkan Uzun Daimi Üye

    Kayıt:
    14 Kasım 2002
    Mesajlar:
    3,312
    Beğenilen Mesajlar:
    0
    Meslek:
    Software Developer @ DELL
    Şehir:
    Skype
    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
     
  3. mudavim

    mudavim Yeni Üye

    Kayıt:
    12 Ocak 2003
    Mesajlar:
    6
    Beğenilen Mesajlar:
    0
    yani rand() tek basina calismiyor..
    cevab icin tesekkurler..
     
  4. Fobus

    Fobus .

    Kayıt:
    7 Şubat 2003
    Mesajlar:
    1,094
    Beğenilen Mesajlar:
    0
    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[j] = (rand() % 100) - 20;

    for (i = 0; i<10; i++)
    for (j = 0; j<10; j++)
    if (a[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[j]);

    son:
    return 0;
    }

    saygılar.
     
    Son düzenleme yönetici tarafından yapıldı: 8 Şubat 2003
  5. acehreli

    acehreli Ali Çehreli

    Kayıt:
    19 Ekim 2002
    Mesajlar:
    4,973
    Beğenilen Mesajlar:
    2
    Ö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:

    Kod:
    #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.

    Kod:
    #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