Sorun ekleme. değerini rand()
döndürür . Yani, ikisini eklerseniz, yukarı çıkacaksınız . Eğer bu aşılırsa , ekleme sonucu a'nın alabileceği geçerli aralığın üzerine taşar . İmzalanan değerlerin taşması tanımlanmamış bir davranıştır ve klavyenizin sizinle yabancı dillerde konuşmasına neden olabilir.int
0...RAND_MAX
RAND_MAX * 2
INT_MAX
int
Burada iki rastgele sonuç eklemede kazanç olmadığı için, basit fikir bunu yapmamaktır. Alternatif olarak unsigned int
, toplamı tutabilirse, her bir sonucu ekleme işleminden önce yayınlayabilirsiniz. Veya daha büyük bir tip kullanın. Her long
zamankinden daha geniş olmadığına int
dikkat long long
edin int
, en az 64 bit ise aynı durum geçerlidir !
Sonuç: Sadece eklemekten kaçının. Daha fazla "rastgelelik" sağlamaz. Daha fazla bite ihtiyacınız varsa, değerleri birleştirebilirsiniz sum = a + b * (RAND_MAX + 1)
, ancak bu muhtemelen daha büyük bir veri türü gerektirir int
.
Belirttiğiniz neden sıfır sonuçtan kaçınmak olduğu için: İki rand()
aramanın sonuçlarını ekleyerek her ikisi de sıfır olabileceğinden bu önlenemez . Bunun yerine, arttırabilirsiniz. Eğer RAND_MAX == INT_MAX
, bu yapılamaz int
. Ancak, (unsigned int)rand() + 1
çok, çok muhtemel yapacak. Muhtemelen (kesin olarak değil), çünkü gerektirdiği UINT_MAX > INT_MAX
, farkında olduğum tüm uygulamalar için geçerlidir (oldukça gömülü mimarileri, DSP'leri ve son 30 yılın tüm masaüstü, mobil ve sunucu platformlarını kapsar).
Uyarı:
Zaten burada yorumlarda serpiştirilmiş rağmen, iki rasgele değerler ekleyerek yok lütfen not o değil almak için: tek tip bir dağılım elde, ancak iki zar haddeleme gibi üçgen dağılım 12
hem zar göstermek zorunda (iki zar) 6
. çünkü 11
zaten iki olası varyant vardır: 6 + 5
veya 5 + 6
vb.
Yani, ekleme de bu açıdan kötüdür.
Ayrıca rand()
, bir psödondom sayı üreteci tarafından üretildiklerinden , sonuçların birbirinden bağımsız olmadığını da unutmayın . Standardın hesaplanan değerlerin kalitesini veya tekdüze dağılımını belirtmediğini de unutmayın.
rand()
negatif olamaz ...