2010-02-01 41 views

Trả lời

19

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.

+8

Để 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 –

+1

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

+0

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. –

10

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.

+1

ngẫu nhiên() -> x trong khoảng [0, 1) Tức là, bao gồm 0. – telliott99

+4

@ telliott99: Đó là (gần như) chính xác những gì tôi đã nói. – SLaks

+1

+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! –

32
>>> 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ừ.

+9

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

11

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

+1 Dành cho phao lớn nhất có thể! –

+1

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 –

2

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.

Các vấn đề liên quan