Hàm Math.random() không thật sự random?

Cho em hỏi là mn có thấy rằng hàm Math.random() nó không thật sự random không

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

3 Likes

Lại chuyện random nữa rồi đấy.

4 Likes

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

2 Likes

A
Anh check thử đi

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.

5 Likes

em thử thêm 1 dấu = thì thấy nó có vẻ random hơn

em sửa thành ntn thì thấy nó random hơn cái trước

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()

5 Likes

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 :rofl:. 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 :rofl:

https://codeaholicguy.com/2016/06/14/nen-dung-hay-de-so-sanh-trong-javascript/

2 Likes

Thanks mn nha,Em xin phép off topic tại đây

1 Like

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.

7 Likes

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 :rofl:

Hôm trước em cũng viết 1 program kéo búa bao kiểu kiểu này :smile: :grin:

3 Likes

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ỹ” :smiley:

Math.floor(Math.random() * 2)
3 Likes

oh,quên mất,đúng là thay Math.floor vào nó rd hơn :roll_eyes:

Hehe,điểm HK kém hơn mấy năm trc nên về viết cho đỡ bùn :rofl: :rofl:

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?