Saya membutuhkan fungsi yang akan menghasilkan bilangan bulat acak dalam rentang yang diberikan (termasuk nilai batas). Saya tidak persyaratan kualitas / keacakan yang tidak masuk akal, saya memiliki empat persyaratan:
- Saya perlu cepat. Proyek saya perlu menghasilkan jutaan (atau kadang-kadang bahkan puluhan juta) angka acak dan fungsi generator saya saat ini telah terbukti menjadi hambatan.
- Saya membutuhkannya agar seragam (penggunaan rand () baik-baik saja).
- rentang min-max bisa apa saja dari <0, 1> hingga <-32727, 32727>.
- itu harus ditaburkan.
Saat ini saya memiliki kode C ++ berikut:
output = min + (rand() * (int)(max - min) / RAND_MAX)
Masalahnya adalah, itu tidak benar-benar seragam - maks dikembalikan hanya ketika rand () = RAND_MAX (untuk Visual C ++ itu 1/32727). Ini adalah masalah utama untuk rentang kecil seperti <-1, 1>, di mana nilai terakhir hampir tidak pernah dikembalikan.
Jadi saya mengambil pena dan kertas dan menghasilkan formula berikut (yang dibangun di atas (int) (n + 0,5) trik pembulatan bilangan bulat):
Tapi itu masih tidak memberi saya distribusi seragam. Berjalan berulang dengan 10.000 sampel memberi saya rasio 37:50:13 untuk nilai nilai -1, 0. 1.
Bisakah Anda menyarankan formula yang lebih baik? (atau bahkan seluruh fungsi generator nomor pseudo-acak)