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.int0...RAND_MAXRAND_MAX * 2INT_MAXint
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 longzamankinden daha geniş olmadığına intdikkat long longedin 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 12hem zar göstermek zorunda (iki zar) 6. çünkü 11zaten iki olası varyant vardır: 6 + 5veya 5 + 6vb.
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 ...