Tôi cần một hàm sẽ tạo một số nguyên ngẫu nhiên trong phạm vi nhất định (bao gồm các giá trị viền). Tôi không yêu cầu chất lượng / ngẫu nhiên không hợp lý, tôi có bốn yêu cầu:
- Tôi cần nó để được nhanh chóng. Dự án của tôi cần tạo ra hàng triệu (hoặc đôi khi thậm chí hàng chục triệu) số ngẫu nhiên và chức năng tạo hiện tại của tôi đã được chứng minh là một nút cổ chai.
- Tôi cần nó để được thống nhất hợp lý (sử dụng rand () là hoàn toàn tốt).
- phạm vi tối thiểu có thể là bất cứ thứ gì từ <0, 1> đến <-32727, 32727>.
- nó phải được gieo hạt
Tôi hiện đang có mã C ++ sau đây:
output = min + (rand() * (int)(max - min) / RAND_MAX)
Vấn đề là, nó không thực sự đồng nhất - max chỉ được trả về khi rand () = RAND_MAX (đối với Visual C ++ là 1/32727). Đây là vấn đề chính đối với các phạm vi nhỏ như <-1, 1>, trong đó giá trị cuối cùng gần như không bao giờ được trả về.
Vì vậy, tôi lấy bút và giấy và đưa ra công thức sau (được xây dựng trên thủ thuật làm tròn số nguyên (int) (n + 0,5)):
Nhưng nó vẫn không cho tôi phân phối thống nhất. Các lần chạy lặp lại với 10000 mẫu cho tôi tỷ lệ 37:50:13 cho các giá trị giá trị -1, 0. 1.
Bạn có thể vui lòng đề nghị công thức tốt hơn? (hoặc thậm chí toàn bộ hàm tạo số giả ngẫu nhiên)