Trong ví dụ Josh đưa ra phương thức ngẫu nhiên sai lệch tạo ra số ngẫu nhiên dương với giới hạn trên cho trước n
, tôi không hiểu hai những sai sót mà anh nói.Mục Java hiệu quả 47: Biết và sử dụng thư viện của bạn - Ví dụ về phương pháp số nguyên ngẫu nhiên
Phương pháp từ cuốn sách là:
private static final Random rnd = new Random();
//Common but deeply flawed
static int random(int n) {
return Math.abs(rnd.nextInt()) % n;
}
- Ông nói rằng nếu n là một điện nhỏ của 2, chuỗi các số ngẫu nhiên được tạo ra sẽ lặp lại bản thân sau một thời gian ngắn. Tại sao điều này là trường hợp? Các tài liệu cho
Random.nextInt()
nóiReturns the next pseudorandom, uniformly distributed int value from this random number generator's sequence.
Vì vậy, nó không phải là nếu n là một số nguyên nhỏ thì trình tự sẽ lặp lại chính nó, tại sao điều này chỉ áp dụng cho quyền hạn của 2? - Tiếp theo, ông nói rằng nếu n không phải là công suất của 2, một số con số sẽ được trả về trung bình thường xuyên hơn những số khác. Tại sao điều này xảy ra, nếu
Random.nextInt()
tạo ra các số nguyên ngẫu nhiên được phân phối đồng đều? (Ông cung cấp một đoạn mã trong đó thể hiện rõ ràng điều này nhưng tôi không hiểu tại sao đây là trường hợp, và làm thế nào điều này liên quan đến n là một sức mạnh của 2).
Tại sao lại sử dụng phương pháp đó? 'rnd.nextInt (n) ' –
@Elliott Đó là điểm của ví dụ trong cuốn sách. – Kevin
Tôi thích thú khi tác giả bỏ qua lỗ hổng lớn nhất: mã này đôi khi sẽ trả lại số âm! –