SORU
11 HAZİRAN 2012, PAZARTESİ


Neden insanlar rastgele bir sayı kullanırken modül önyargı var ki jeneratör?

Çok sorulan bu soruyu gördüm ama asla gerçek somut bir cevap gördüm. Umarım insanlar "modül önyargı" rastgele sayı üreteci kullanarak, C rand() gibi . neden anlamanıza yardımcı olacaktır burada yazılan gidiyorum yani

CEVAP
11 HAZİRAN 2012, PAZARTESİ


Yani rand() rasgele sayı üreteci olan seçer bir doğal sayı arasında 0 RAND_MAX ya da sabit tanımlı cstdlib (bkz: bu article genel bakış rand()).

Şimdi söylesem, 0 ile 2 arasında rastgele bir sayı oluşturmak istiyorsanız ne olur. Açıklama uğruna, hadi RAND_MAX 10 rand()%3 çağırarak, 0 ile 2 arasında rastgele bir sayı üretmek için karar söylüyorlar. Ancak, rand()%3 eşit olasılık ile 0 ve 2 arasındaki sayılar üretmek değil! rand() 0, 3, 6 veya 9, rand()%3 == 0 döndürür. rand() 1, 4, 7 veya 10, rand()%3 == 1 döndürür. rand() 2, 5 veya 8, 14 ** döner. Şimdi Eğer bu istatistiksel olarak analiz edersek, biz 0 4/11, 1 ise elde etme olasılığı 4/11 çok hızlı ama 2 3/11. Bu eşit olasılık ile 0 ve 2 arasındaki sayıların oluşturmaz. Küçük aralıklar için tabii ki bu büyük bir sorun olmayabilir ama daha büyük bir aralığı için bu dağılımı, daha küçük sayılar kutuplama bir sonuç çıkabilir.

rand()%n eşit olasılıkla n-1 0 ile sayılar bir dizi? RAND_MAX%n == n - 1. rand() eşit olasılık ile 0 ve RAND_MAX arasında bir sayı döndürür bizim önceki varsayımı ile birlikte, bu durumda, n ile bölümünden kalan sınıfları da eşit olarak dağıtılır.

Nasıl bu sorunu çözmek mi? Bir şekilde istediğiniz aralığı: bir sayı elde edene kadar rastgele sayılar üretmeye devam etmektir

int x; 
do {
    x = rand();
} while (x >= n);

Herkese yardımcı olur umarım!

Yararlanılan kaynaklar ve daha fazla bilgi için:

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ehowhome

    ehowhome

    22 NİSAN 2009
  • Epic Tutorials for iPhone, iPad and iOS

    Epic Tutoria

    18 EYLÜL 2011
  • UCBerkeley

    UCBerkeley

    3 Mayıs 2006