Verilen aralıkta (sınır değerleri dahil) rasgele bir tamsayı üretecek bir fonksiyona ihtiyacım var. Mantıksız kalite / rastgelelik gereklilikleri yok, dört gereksinimim var:
- Hızlı olması lazım. Projemin milyonlarca (hatta bazen on milyonlarca) rastgele sayı üretmesi gerekiyor ve şu anki jeneratör fonksiyonumun bir darboğaz olduğu kanıtlandı.
- Ben makul düzgün olması gerekir (rand () kullanımı gayet iyi).
- min-maks aralıklar <0, 1> ila <-32727, 32727> arasında herhangi bir şey olabilir.
- görülebilmelidir.
Şu anda aşağıdaki C ++ kodu var:
output = min + (rand() * (int)(max - min) / RAND_MAX)
Sorun şu ki, gerçekten üniform değil - max sadece rand () = RAND_MAX (Visual C ++ için 1/32727) olduğunda döndürülür. Bu, son değerin neredeyse hiç döndürülmediği <-1, 1> gibi küçük aralıklar için büyük bir sorundur.
Bu yüzden kalem ve kağıt aldım ve aşağıdaki formülü ((int) (n + 0.5) tamsayı yuvarlama hilesi üzerine inşa etti) buldum:
Ama yine de bana düzgün bir dağılım vermiyor. 10000 numuneyle tekrarlanan çalışmalar, -1, 0.1 değerleri için bana 37:50:13 oranını verir.
Daha iyi formül önerebilir misiniz? (hatta tüm sahte rasgele sayı üreteci işlevi)