Cho em hỏi là mn có thấy rằng hàm Math.random() nó không thật sự random không
Hàm Math.random() không thật sự random?
Không chỉ Math.random() mà mọi hàm tạo giá trị random ở mọi ngôn ngữ lập trình đều được dựa trên thuật toán, thành ra là chẳng có cái hàm random nào random tuyệt đối cả. Giống như môi trường chân không tương đối có tồn tại, còn môi trường chân không tuyệt đối thì không vậy. Mọi hàm random bây giờ đều hướng đến việc tạo ra giá trị càng random càng tốt
Lại chuyện random nữa rồi đấy.
Yeah,em hỏi như vậy là vì hôm qua vừa mới làm nghịch 1 cái trò voi và kiến xong,lấy math.random từ 0-2.Cho 0 là Voi,1 là kiến,2 là gà.Mà nhiều khi reset trang mà 10 lần vào voi
Và cho em hỏi là có cách nào để random nó thật sự ‘random’ hơn ko
Really? Khả năng cao là code của em có vấn đề chứ làm sao có chuyện đó được?
Như anh đã nói, chẳng có cái thuật toán nào thật sự ‘random’ cả. Mà thay vào đó, tại sao em không tự viết hàm random? Lười quá thì dùng cái thư viện nào đó thôi. Mà thường thì chẳng ai làm 2 cách trên cả.
Bạn có để ý rằng Math.random() khi không có tham số nó ra một số thực lớn hơn 0 và nhỏ hơn 1 không? Từ cái số đó bạn nhân với một số nguyên lớn hơn 2, rồi làm tròn để lấy số ngẫu nhiên thì nó sẽ random hơn một chút.
em thử thêm 1 dấu = thì thấy nó có vẻ random hơn
Như @superthin đã nói, trong trường hợp này em nên truyền tham số vào hàm Math.random(), ngoài ra nên thay parseInt thành Math.floor(). Xin trích dẫn lí do từ trang https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt(đây là trang mà các devs front-end ở trong và ngoài nước hay tới để xem khái niệm các hàm, prototype,…của javascript và một số thứ khác):
Because some numbers use the e
character in their string representation (e.g. 6.022e23
for 6.022 × 1023), using parseInt
to truncate numbers will produce unexpected results when used on very large or very small numbers. parseInt
should not be used as a substitute for Math.floor()
.
Tạm dịch(Anh dịch có thể hơi kém tí, mong em thông cảm): Bởi vì một vài số dùng kí tự e
trong chuỗi đại diện cho nó, sử dụng parseInt
để cắt ngắn(?) số sẽ trả về một kết quả không xác định được khi parseint
được sử dụng trên một số rất lớn hoặc rất nhỏ. parseInt
không nên được sử dụng như là một cách để thay thế Math.floor()
Nhưng cho em hỏi thì === nó có vẻ ngẫu nhiên hơn == phải không
Cái này được coi như là một trong những điểm kì quặc nhất của Javascript . Khi dùng phép so sánh trong Javascript thì lời khuyên thật lòng của anh là nên dùng dấu 3 bằng
https://codeaholicguy.com/2016/06/14/nen-dung-hay-de-so-sanh-trong-javascript/
Thanks mn nha,Em xin phép off topic tại đây
Không, ba dấu bằng khác hai dấu bằng ở chỗ:
chứ không liên quan gì đến random. Nói đúng hơn, đừng đi quá nhanh, học cái gì cũng nên kiên nhẫn, đọc kỹ lý thuyết cơ bản/ nền tảng một chút.
e cũng có đọc cái này rồi,cơ mà e thấy nó random nhiều hơn nên thấy lạ thôi
Hôm trước em cũng viết 1 program kéo búa bao kiểu kiểu này
Lại đi quá nhanh rồi, bạn trên gợi ý dùng Math.floor() thay cho parseInt(), bạn đã thử thay cái đó vào code chưa? Chứ rồi cứ lướt lướt không đọc, nó lại “ít random” rồi lại la làng lên là sao loay hoay một lát nó lại “u như kỹ”
Math.floor(Math.random() * 2)
oh,quên mất,đúng là thay Math.floor vào nó rd hơn
Hehe,điểm HK kém hơn mấy năm trc nên về viết cho đỡ bùn