Masalahnya adalah penambahan. rand()
mengembalikan int
nilai 0...RAND_MAX
. Jadi, jika Anda menambahkan dua dari mereka, Anda akan bangun RAND_MAX * 2
. Jika itu melebihi INT_MAX
, hasil penambahan melebihi rentang yang valid yang int
dapat ditampung. Melimpahnya nilai yang ditandatangani adalah perilaku yang tidak terdefinisi dan dapat menyebabkan papan ketik Anda berbicara kepada Anda dalam bahasa asing.
Karena tidak ada keuntungan di sini dalam menambahkan dua hasil acak, ide sederhana adalah tidak melakukannya. Atau Anda dapat memberikan setiap hasil unsigned int
sebelum penambahan jika itu dapat menahan jumlah. Atau gunakan tipe yang lebih besar. Catatan yang long
belum tentu lebih luas dari int
, hal yang sama berlaku long long
jika int
setidaknya 64 bit!
Kesimpulan: Hindari saja penambahan. Itu tidak memberikan lebih banyak "keacakan". Jika Anda membutuhkan lebih banyak bit, Anda bisa menggabungkan nilainya sum = a + b * (RAND_MAX + 1)
, tetapi itu juga kemungkinan membutuhkan tipe data yang lebih besar daripada int
.
Karena alasan yang Anda nyatakan adalah untuk menghindari hasil nol: Itu tidak dapat dihindari dengan menambahkan hasil dari dua rand()
panggilan, karena keduanya bisa nol. Sebagai gantinya, Anda hanya bisa menambah. Jika RAND_MAX == INT_MAX
, ini tidak dapat dilakukan di int
. Namun, (unsigned int)rand() + 1
akan melakukan sangat, sangat mungkin. Kemungkinan (tidak pasti), karena memang membutuhkan UINT_MAX > INT_MAX
, yang benar pada semua implementasi yang saya ketahui (yang mencakup beberapa arsitektur tertanam, DSP, dan semua platform desktop, seluler, dan server selama 30 tahun terakhir).
Peringatan:
Meskipun sudah ditaburkan di komentar di sini, harap dicatat bahwa menambahkan dua nilai acak tidak mendapatkan distribusi yang seragam, tetapi distribusi segitiga seperti menggulung dua dadu: untuk mendapatkan 12
(dua dadu) kedua dadu harus ditampilkan 6
. karena 11
sudah ada dua varian yang mungkin: 6 + 5
atau 5 + 6
, dll.
Jadi, penambahannya juga buruk dari aspek ini.
Juga catat bahwa hasil yang rand()
dihasilkan tidak independen satu sama lain, karena dihasilkan oleh generator nomor pseudorandom . Perhatikan juga bahwa standar tidak menentukan kualitas atau distribusi seragam dari nilai yang dihitung.
rand()
tidak boleh negatif ...