ฉันต้องการฟังก์ชั่นที่จะสร้างจำนวนเต็มแบบสุ่มในช่วงที่กำหนด (รวมถึงค่าเส้นขอบ) ฉันไม่ต้องการคุณภาพ / การสุ่มที่ไม่มีเหตุผลฉันมีข้อกำหนดสี่ข้อ:
- ฉันต้องการมันเร็ว โครงการของฉันต้องสร้างตัวเลขสุ่มนับล้าน (หรือบางครั้งก็เป็นสิบล้าน) และฟังก์ชันตัวสร้างปัจจุบันของฉันได้พิสูจน์แล้วว่าเป็นคอขวด
- ฉันต้องการมันเพื่อให้มีความสม่ำเสมอ (การใช้แรนด์ () นั้นดีมาก)
- ช่วง min-max สามารถเป็นอะไรก็ได้ตั้งแต่ <0, 1> ถึง <-32727, 32727>
- มันจะต้องมีเมล็ด
ขณะนี้ฉันมีรหัส C ++ ดังต่อไปนี้:
output = min + (rand() * (int)(max - min) / RAND_MAX)
ปัญหาคือว่ามันไม่เหมือนกันจริงๆ - max จะถูกส่งคืนเมื่อ rand () = RAND_MAX (สำหรับ Visual C ++ เป็น 1/32727) นี่เป็นปัญหาสำคัญสำหรับช่วงขนาดเล็กเช่น <-1, 1> ซึ่งค่าสุดท้ายแทบไม่เคยส่งคืน
ดังนั้นฉันจึงคว้าปากกาและกระดาษและมาพร้อมกับสูตรต่อไปนี้ (ซึ่งสร้างขึ้นบนเคล็ดลับการปัดเศษ (จำนวนเต็ม) (n + 0.5) จำนวนเต็ม):
แต่มันก็ไม่ได้ให้การกระจายที่เหมือนกัน การรันซ้ำกับ 10,000 ตัวอย่างให้ฉันอัตราส่วน 37:50:13 สำหรับค่า -1, 0. 1
คุณช่วยแนะนำสูตรที่ดีกว่านี้ได้ไหม (หรือฟังก์ชั่นการสร้างตัวเลขสุ่มหลอกทั้งหมด)