2010-07-27 36 views

Trả lời

8

Math.random() tạo ra một số dấu chấm động 16 chữ số thập phân lớn hơn hoặc bằng số không và ít hơn 1.

+5

Số dấu phẩy động Javascript là các giá trị IEEE 754 64 bit, vì vậy nó không * chính xác * 16 chữ số thập phân. – Pointy

+0

Làm thế nào nó sẽ không chính xác? – jpc826

+0

@volatile: Nếu độ chính xác của bạn không phải là sức mạnh của 10. – Brian

3

Theo wikipedia: Double-precision floating-point format phần phần là 52 bit, và chúng ta biết rằng con số đó sẽ được giữa 0 và 1 (tôi nghĩ không bao gồm 1), vì vậy số mũ là -1, khiến chúng ta có 52 bit ngẫu nhiên.

52 bit ngẫu nhiên cung cấp cho bạn 52 bit chính xác, mà trong cơ sở 10 là khoảng

52*log10(2) ~= 15.653559774527022151114422525674 digits. 
6

Nó của trình duyệt/động cơ Javascript phụ thuộc.

Độ chính xác tối đa có thể là 52 bit, bởi vì Math.random trả lại dấu phẩy động kép chính xác giữa 0 (bao gồm) và 1 (độc quyền). Điều này tối đa tương ứng với khoảng 16 thập phân, xem câu trả lời của Sly1024.

Trong thực tế, nhiều trình duyệt cung cấp độ chính xác nhỏ hơn. Đây có vẻ là trạng thái hiện tại:

  • Firefox: đầy đủ 52 bit ngẫu nhiên.
  • V8/Chrome: 32 bit chính xác (một số năm trước đây nó đã từng là thấp như 30 bit, xem https://codereview.chromium.org/1599019)
  • Safari: 32 bit
  • IE:

Chạy đoạn mã sau nhiều lần và bạn sẽ thấy rằng 21 bit cuối luôn bằng 0 trong Chrome và Safari.

console.log((Math.random() * Math.pow(2,53)).toString(2));

+0

IE11: 52 bit ngẫu nhiên, mặc dù mã ở trên cho kết quả như '111000000101010100010110011011110111000111010101110.1' đôi khi. –

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