Liệu ngẫu nhiên python.random() có bao giờ trả lại 1.0 hay không nó chỉ trả về cho đến 0.9999 ..?Phạm vi của ngẫu nhiên python.random() từ thư viện chuẩn
Trả lời
Documents đang ở đây: http://docs.python.org/library/random.html
... ngẫu nhiên(), mà tạo ra một phao ngẫu nhiên thống nhất trong bán mở khoảng [0.0, 1.0).
Vì vậy, giá trị trả về sẽ lớn hơn hoặc bằng 0 và nhỏ hơn 1.0.
Để giải thích về ký hiệu khung/dấu ngoặc đơn, hãy xem tại đây: http: //en.wikipedia. org/wiki/Interval_ (toán học) #Terminology –
Tôi nghĩ rằng hệ thống trợ giúp nội bộ của Python (như đã đề cập trong câu trả lời khác) sẽ dễ tiếp cận hơn khi bạn lập trình bằng Python. 'help (random.random)' sẽ đưa ra OP (các) thông tin mà anh ta cần. – Omnifarious
Tốt hơn nên liên kết với tài liệu thực khi bạn viết trên trang web. –
Hàm random.random
của Python trả về các số nhỏ hơn, nhưng không bằng 1
.
Tuy nhiên, nó có thể trả về 0
.
ngẫu nhiên() -> x trong khoảng [0, 1) Tức là, bao gồm 0. – telliott99
@ telliott99: Đó là (gần như) chính xác những gì tôi đã nói. – SLaks
+1 là câu trả lời duy nhất không dựa vào ký hiệu toán học khoa học viễn tưởng! –
>>> help(random.random)
Help on built-in function random:
random(...)
random() -> x in the interval [0, 1).
Điều đó có nghĩa là 1 bị loại trừ.
Tôi thích câu trả lời của bạn nhất. Python có một hệ thống trợ giúp nội bộ tuyệt vời và mọi người nên được khuyến khích sử dụng nó. – Omnifarious
Các câu trả lời khác đã làm rõ rằng 1 không được bao gồm trong phạm vi, nhưng ngoài tò mò, tôi quyết định xem xét nguồn để xem chính xác cách tính toán.
nguồn Các CPython thể được tìm thấy here
/* random_random is the function named genrand_res53 in the original code;
* generates a random number on [0,1) with 53-bit resolution; note that
* 9007199254740992 == 2**53; I assume they're spelling "/2**53" as
* multiply-by-reciprocal in the (likely vain) hope that the compiler will
* optimize the division away at compile-time. 67108864 is 2**26. In
* effect, a contains 27 random bits shifted left 26, and b fills in the
* lower 26 bits of the 53-bit numerator.
* The orginal code credited Isaku Wada for this algorithm, 2002/01/09.
*/
static PyObject *
random_random(RandomObject *self)
{
unsigned long a=genrand_int32(self)>>5, b=genrand_int32(self)>>6;
return PyFloat_FromDouble((a*67108864.0+b)*(1.0/9007199254740992.0));
}
Vì vậy, các chức năng một cách hiệu quả tạo ra m/2^53
nơi 0 <= m < 2^53
là một số nguyên. Vì phao có độ chính xác 53 bit bình thường, điều này có nghĩa là trên phạm vi [1/2, 1), mọi phao có thể được tạo ra. Đối với các giá trị gần bằng 0, nó bỏ qua một số giá trị float có thể cho hiệu quả nhưng các số được tạo ra được phân bố đồng đều trong phạm vi. Số lớn nhất có thể được tạo ra bởi random.random
là chính xác
0,99999999999999988897769753748434595763683319091796875
+1 Dành cho phao lớn nhất có thể! –
Nếu mã C ở trên được biên dịch với -fsingle-precision-constant, điều này có thể mang lại 1.0. Xem câu trả lời của tôi để biết chi tiết –
Từ mã trong câu trả lời Antimon của nó rất dễ dàng để xem random.random rằng() không bao giờ trả về chính xác 1.0 trên nền tảng đó có ít nhất 53 chút mantissa cho các tính toán liên quan đến hằng số không được chú thích với 'f' trong C. Đó là độ chính xác IEEE 754 quy định và là tiêu chuẩn ngày nay. Tuy nhiên, trên các nền tảng có độ chính xác thấp hơn, ví dụ nếu Python được biên dịch với hằng số chính xác -fsingle để sử dụng trên nền tảng nhúng, thêm b vào * 67108864.0 có thể làm tròn đến 2^53 nếu b là đủ gần 2^26 và điều này có nghĩa là 1.0 được trả về. Lưu ý rằng điều này xảy ra bất kể hàm PyFloat_FromDouble của Python chính xác sử dụng cái gì.
Một cách để kiểm tra điều này là kiểm tra vài trăm số ngẫu nhiên cho dù bit thứ 53 là bao giờ 1. Nếu ít nhất 1 lần điều này chứng minh đủ chính xác và bạn vẫn ổn. Nếu không, làm tròn là giải thích có khả năng nhất có nghĩa là random.random() có thể trả về 1.0. Đó là tất nhiên có thể là bạn chỉ là không may mắn. Bạn có thể đẩy độ chắc chắn cao như bạn muốn bằng cách thử nghiệm nhiều số hơn.
- 1. Số ngẫu nhiên giữa hai phạm vi
- 2. Số ngẫu nhiên trong một phạm vi
- 3. Nhận số nguyên ngẫu nhiên trong phạm vi (x, y]
- 4. Tạo một số ngẫu nhiên trong phạm vi?
- 5. Tạo một đôi ngẫu nhiên trong một phạm vi
- 6. Phạm vi và thư viện Java Class
- 7. Thư viện Bản đồ Phạm vi Haskell
- 8. chọn tệp ngẫu nhiên từ thư mục
- 9. Cách lấy một số ngẫu nhiên từ một phạm vi, ngoại trừ một số giá trị
- 10. Làm cách nào để chọn 1 số ngẫu nhiên từ 2 phạm vi số khác nhau?
- 11. Tạo một số ngẫu nhiên gấp đôi của một phạm vi nhất định trong Java
- 12. Tạo một số nguyên ngẫu nhiên trong một phạm vi trong Haskell
- 13. PHP: số ngẫu nhiên từ một phân phối chuẩn
- 14. Hàng ngẫu nhiên của Oracle từ bảng
- 15. Phạm vi liên kết phạm vi C tiêu chuẩn
- 16. số ngẫu nhiên không quá ngẫu nhiên
- 17. Làm thế nào để chèn 1000 ngày ngẫu nhiên giữa một phạm vi nhất định?
- 18. Các thư viện hoặc công cụ để tạo văn bản ngẫu nhiên nhưng thực tế
- 19. Tài liệu thư viện chuẩn của SBCL?
- 20. Tạo một số ngẫu nhiên trong phạm vi 0-9 trong x86 8086 Hội
- 21. PHP kéo hình ảnh ngẫu nhiên từ thư mục
- 22. Thư viện chuẩn của Intel (C++)
- 23. phiên bản của thư viện chuẩn C++
- 24. lặp ngẫu nhiên trong Python
- 25. Tạo một số ngẫu nhiên trong một phạm vi bằng cách sử dụng C#
- 26. Mysql chèn datetime ngẫu nhiên trong một phạm vi ngày nhất định
- 27. Làm thế nào để tạo ra phạm vi ngày cho dữ liệu ngẫu nhiên trên bash
- 28. Hibernate Tiêu chuẩn API: lấy n hàng ngẫu nhiên
- 29. Tại sao không ngẫu nhiên() ngẫu nhiên?
- 30. Tạo chuỗi ngẫu nhiên
Có vàng trong đó đồi núi. 42 điểm (và đếm) cho một câu hỏi về những gì random.random() trả về. –
telliott99
Lưu ý nếu bạn không chấm dứt chuỗi 0.9999, nó thực sự bằng 1.0. –