JavaScript Math có thực sự ngẫu nhiên không?

Trong bài viết này, chúng ta sẽ xem xét cách tạo số ngẫu nhiên trong JavaScript với

const y = Math.random()*10
9, xây dựng hàm mà bạn có thể sử dụng lại cho nhiều mục đích — chẳng hạn như tải hình ảnh ngẫu nhiên, chọn phần tử ngẫu nhiên từ một mảng và tạo số ngẫu nhiên

Tính ngẫu nhiên trong JavaScript

Việc có thể thêm yếu tố ngẫu nhiên vào chương trình của bạn luôn hữu ích. Bạn có thể muốn thêm gia vị cho trang web của mình bằng cách thêm một số kiểu ngẫu nhiên, tạo cụm từ ngẫu nhiên hoặc thêm yếu tố may rủi vào trò chơi (ví dụ: chúng được sử dụng rộng rãi trong trò chơi Numble này)

Thật không may, thực sự rất khó để tạo ra một giá trị thực sự ngẫu nhiên (trừ khi bạn có quyền truy cập vào một số chất phóng xạ… hoặc một con khỉ với bàn phím. Để giải quyết vấn đề này, các ngôn ngữ lập trình sử dụng các phương thức xác định để tạo ra các số giả ngẫu nhiên. Đây là những số có vẻ như là ngẫu nhiên nhưng thực tế được tạo bởi các hàm chấp nhận các giá trị gốc dựa trên các sự kiện như thời gian hoặc vị trí của con trỏ chuột

JavaScript có hàm

0 <= y < 10
0, là một phương thức của đối tượng
0 <= y < 10
1 được tích hợp sẵn. Tiêu chuẩn ECMAScript không chỉ định cách chức năng này sẽ tạo ra một số ngẫu nhiên, do đó, tùy thuộc vào nhà cung cấp trình duyệt để triển khai. Tại thời điểm viết bài, tất cả các trình duyệt chính hiện đang sử dụng thuật toán xorshift128+ trong nền để tạo số giả ngẫu nhiên

Để sử dụng nó, chỉ cần nhập

const y = Math.random()*10
9 và nó sẽ trả về một số thập phân dấu phẩy động giả ngẫu nhiên giữa 0 (bao gồm) và 1 (độc quyền)

const x = Math.random();

Điều này có thể được biểu diễn dưới dạng bất đẳng thức sau

0 <= x < 1

Nhưng nếu bạn muốn một số ngẫu nhiên lớn hơn 1 thì sao? . tất cả những gì bạn cần làm là nhân với một hệ số tỷ lệ để tăng tỷ lệ — ví dụ: nhân kết quả với 10 sẽ tạo ra giá trị từ 0 (bao gồm) đến 10 (không bao gồm)

const y = Math.random()*10

Lý do cho điều này có thể được nhìn thấy nếu chúng ta nhân cả hai vế của bất đẳng thức trước với 10

0 <= y < 10

Nhưng kết quả vẫn là một số thập phân dấu phẩy động. Nếu chúng ta muốn một số nguyên ngẫu nhiên thì sao? . tất cả những gì chúng ta cần làm là sử dụng hàm

0 <= y < 10
3 để làm tròn giá trị được trả về xuống số nguyên bên dưới. Đoạn mã sau sẽ gán một số nguyên ngẫu nhiên từ 0 đến 9 bao gồm biến
0 <= y < 10
4

0 <= y < 10
0

Lưu ý rằng, mặc dù chúng ta nhân với 10, nhưng giá trị trả về chỉ lên đến 9

Chúng ta có thể tổng quát hóa phương thức này để tạo một hàm sẽ trả về một số nguyên ngẫu nhiên trong khoảng từ 0 đến tối đa, nhưng không bao gồm, số được cung cấp làm đối số

0 <= y < 10
1

Bây giờ chúng ta có thể sử dụng hàm này để trả về một chữ số ngẫu nhiên trong khoảng từ 0 đến 9

0 <= y < 10
2

Vì vậy, bây giờ chúng ta có một cách để tạo một số nguyên ngẫu nhiên. Nhưng còn một số nguyên ngẫu nhiên nằm giữa hai giá trị khác nhau, không phải lúc nào cũng bắt đầu từ số 0 thì sao? . Ví dụ: nếu chúng tôi muốn tạo một số nguyên ngẫu nhiên trong khoảng từ 6 đến 10, chúng tôi sẽ bắt đầu bằng cách sử dụng mã ở trên để tạo một số nguyên ngẫu nhiên trong khoảng từ 0 đến 4, sau đó thêm 6 vào kết quả

0 <= y < 10
3

Lưu ý rằng, để tạo một số nguyên ngẫu nhiên giữa

0 <= y < 10
5 và
0 <= y < 10
6, chúng ta thực sự phải nhân với
0 <= y < 10
7

Chúng ta có thể khái quát hóa phương thức này để tạo một hàm sẽ trả về một số nguyên ngẫu nhiên giữa hai giá trị

0 <= y < 10
7

Đây chỉ đơn giản là một dạng mã tổng quát mà chúng tôi đã viết để lấy một số ngẫu nhiên trong khoảng từ 6 đến 10, nhưng với 6 được thay thế bằng tham số

0 <= y < 10
8 và 10 được thay thế bằng tham số
0 <= y < 10
9. Để sử dụng nó, chỉ cần nhập hai đối số để biểu thị giới hạn trên và dưới của số ngẫu nhiên (đã bao gồm). Vì vậy, để mô phỏng tung một con xúc xắc sáu mặt, chúng ta có thể sử dụng đoạn mã sau để trả về một số nguyên trong khoảng từ 1 đến 6

0 <= y < 10
0

Để cho thấy hàm

0 <= y < 10
00 hoạt động như thế nào, tôi đã nối nó với một số HTML trong bản trình diễn bên dưới, vì vậy bạn có thể thay đổi các giá trị của
0 <= y < 10
8 và
0 <= y < 10
9 và tạo một số nguyên ngẫu nhiên bằng cách nhấp vào nút (có thể được sử dụng để sao chép hàm

Xem Bút
Số nguyên ngẫu nhiên – SitePoint theo SitePoint (@SitePoint)
trên CodePen.

Bây giờ chúng ta có một số hàm để tạo số nguyên ngẫu nhiên, chúng ta có thể sử dụng chúng để thực hiện một số điều thú vị

Tải một hình ảnh ngẫu nhiên

Để bắt đầu, chúng ta sẽ sử dụng hàm

0 <= y < 10
03 để tải một ảnh ngẫu nhiên từ trang web Lorem Picsum. Trang web này cung cấp cơ sở dữ liệu về hình ảnh giữ chỗ, mỗi hình ảnh có ID số nguyên duy nhất. Điều này có nghĩa là chúng ta có thể tạo một liên kết đến một hình ảnh ngẫu nhiên bằng cách chèn một số nguyên ngẫu nhiên vào URL

Tất cả những gì chúng ta cần làm là thiết lập HTML sau sẽ hiển thị hình ảnh có ID là 0

0 <= x < 1
0

Sau đó, chúng tôi có thể kết nối JavaScript sau để tạo một số nguyên ngẫu nhiên cho ID và cập nhật HTML để hiển thị một hình ảnh mới một cách ngẫu nhiên khi nhấp vào nút

0 <= x < 1
1

Bạn có thể thấy điều này trên bản demo CodePen bên dưới

Xem bút
Ảnh ngẫu nhiên – SitePoint của SitePoint (@SitePoint)
trên CodePen.

Tạo màu ngẫu nhiên

Trong HTML và CSS, màu sắc được biểu thị bằng ba số nguyên từ 0 đến 255, được viết ở dạng thập lục phân (cơ số 16). Cái đầu tiên đại diện cho màu đỏ, cái thứ hai màu xanh lá cây và cái thứ ba màu xanh lam. Điều này có nghĩa là chúng ta có thể sử dụng hàm

0 <= y < 10
03 để tạo màu ngẫu nhiên bằng cách tạo ba số ngẫu nhiên trong khoảng từ 0 đến 255 và chuyển đổi chúng thành cơ số 16. Để chuyển đổi một số thành một cơ số khác, bạn có thể cung cấp một đối số cho phương thức
0 <= y < 10
05, vì vậy đoạn mã sau sẽ trả về một số thập lục phân ngẫu nhiên trong khoảng từ 0 đến FF (255 ở dạng thập lục phân)

0 <= x < 1
2

Bây giờ chúng ta có thể viết hàm

0 <= y < 10
06 sẽ trả về mã màu HTML

0 <= x < 1
3

Điều này trả về một mẫu chữ bắt đầu bằng ký tự băm mà tất cả các mã màu HTML bắt đầu bằng và sau đó nối ba số nguyên ngẫu nhiên trong khoảng từ 0 đến 255 trong cơ sở 16 vào cuối

Gọi hàm

0 <= y < 10
06 sẽ trả về một chuỗi màu HTML ngẫu nhiên

0 <= x < 1
4

Tôi đã nối chức năng này với một nút HTML để nó thay đổi màu nền của tài liệu mỗi khi nút được nhấp vào trong bản demo CodePen bên dưới

Xem Bút
Màu ngẫu nhiên – SitePoint theo SitePoint (@SitePoint)
trên CodePen.

Tạo một lá thư ngẫu nhiên

Chúng ta đã có một hàm để tạo một số nguyên ngẫu nhiên, nhưng còn các chữ cái ngẫu nhiên thì sao? . Trong cơ số 36, các số nguyên từ 10 đến 35 được biểu thị bằng các chữ cái “a” đến “z”. Bạn có thể kiểm tra điều này bằng cách chuyển đổi một số giá trị thành cơ số 36 trong bảng điều khiển bằng phương pháp

0 <= y < 10
05

0 <= x < 1
5

Bây giờ chúng ta đã biết điều này, thật dễ dàng để viết một hàm

0 <= y < 10
09 sử dụng hàm
0 <= y < 10
03 của chúng ta để tạo một số nguyên ngẫu nhiên trong khoảng từ 10 đến 35 và trả về biểu diễn chuỗi 36 cơ sở của nó

0 <= x < 1
6

Gọi

0 <= y < 10
09 sẽ trả về một chữ cái viết thường ngẫu nhiên từ “a” đến “z”

0 <= x < 1
7

Tôi đã kết nối chức năng này với một nút HTML để bạn có thể thấy nó hoạt động như thế nào trong bản demo CodePen bên dưới

Xem Bút
Chữ cái ngẫu nhiên – SitePoint của SitePoint (@SitePoint)
trên CodePen.

Tạo chuỗi ngẫu nhiên

Bây giờ chúng ta có thể tạo các chữ cái ngẫu nhiên, chúng ta có thể ghép chúng lại với nhau để tạo chuỗi các chữ cái ngẫu nhiên. Hãy viết một hàm

0 <= y < 10
12 chấp nhận một tham số duy nhất,
0 <= y < 10
13 — đại diện cho số lượng chữ cái ngẫu nhiên mà chúng ta muốn trong chuỗi được trả về. Chúng ta có thể tạo một chuỗi các chữ cái ngẫu nhiên bằng cách tạo một mảng hoặc chiều dài
0 <= y < 10
13 và sau đó sử dụng phương thức
0 <= y < 10
15 để thay đổi từng phần tử thành một chữ cái ngẫu nhiên. Sau đó, chúng ta có thể sử dụng phương thức
0 <= y < 10
16 để chuyển đổi mảng thành một chuỗi ký tự ngẫu nhiên

0 <= x < 1
8

Gọi

0 <= y < 10
17 sẽ trả về một chuỗi ngẫu nhiên gồm các chữ cái
0 <= y < 10
13

0 <= x < 1
9

Tôi đã kết nối chức năng này với một nút HTML để bạn có thể thấy nó hoạt động như thế nào trong bản demo CodePen bên dưới

Xem Bút
Chuỗi ngẫu nhiên – SitePoint theo SitePoint (@SitePoint)
trên CodePen.

Chọn một phần tử ngẫu nhiên từ một mảng

Việc có thể chọn một phần tử ngẫu nhiên từ một mảng thường rất hữu ích. Điều này khá dễ thực hiện bằng cách sử dụng chức năng

0 <= y < 10
03 của chúng tôi. Chúng ta có thể chọn ngẫu nhiên một chỉ mục trong mảng, sử dụng độ dài của mảng làm đối số và trả về phần tử tại chỉ mục đó từ mảng

const y = Math.random()*10
0

Ví dụ: lấy mảng sau đại diện cho danh sách các loại trái cây

const y = Math.random()*10
1

Bạn có thể chọn một miếng trái cây ngẫu nhiên bằng cách sử dụng đoạn mã sau

const y = Math.random()*10
2

Tạo một cụm từ ngẫu nhiên

Bây giờ chúng ta có một hàm chọn một phần tử ngẫu nhiên từ các mảng, chúng ta có thể sử dụng nó để tạo các cụm từ ngẫu nhiên. Bạn thường thấy kỹ thuật này được sử dụng làm tên người dùng giữ chỗ trên các trang web. Để bắt đầu, hãy tạo ba mảng, một mảng chứa các chuỗi tính từ, một mảng chứa màu sắc và các danh từ khác, tương tự như các mảng được hiển thị bên dưới

const y = Math.random()*10
3

Bây giờ chúng ta có ba mảng này, việc tạo một cụm từ ngẫu nhiên thật dễ dàng bằng cách sử dụng hàm

0 <= y < 10
20 của chúng ta. Chúng tôi chỉ cần chọn một phần tử ngẫu nhiên từ mỗi mảng và nối chúng, với khoảng cách giữa chúng để tạo thành một cụm từ

const y = Math.random()*10
4

Gọi

0 <= y < 10
21 sẽ trả về một cụm từ ngẫu nhiên nghe hơi buồn cười — với màu sắc, tính từ và danh từ

const y = Math.random()*10
5

Tôi đã kết nối chức năng này với một nút HTML để bạn có thể tạo một số cụm từ thú vị bằng cách nhấn nút trong bản demo CodePen bên dưới

Xem Bút
Cụm từ ngẫu nhiên – SitePoint theo SitePoint (@SitePoint)
trên CodePen.

Tạo mật khẩu ngẫu nhiên

Công dụng cuối cùng của các số nguyên ngẫu nhiên mà chúng ta sẽ xem xét là tạo một chuỗi mật khẩu ngẫu nhiên. Các quy tắc phổ biến cho một mật khẩu là nó chứa ít nhất

  • tám ký tự
  • một ký tự số
  • một ký tự đặc biệt không phải chữ và số

Một ví dụ phù hợp với các quy tắc này có thể là

const y = Math.random()*10
6

Chúng tôi đã có các hàm có thể tạo từng phần tử này cho chúng tôi. Trước hết, chúng tôi sẽ sử dụng

0 <= y < 10
22 để tạo một chuỗi ngẫu nhiên gồm sáu chữ cái. Sau đó, chúng tôi sẽ sử dụng hàm
0 <= y < 10
20 để chọn một ký tự đặc biệt từ một mảng, sau đó chúng tôi sẽ sử dụng
0 <= y < 10
24 để trả về một chữ số ngẫu nhiên. Tất cả những gì chúng ta cần làm sau đó là nối chúng lại và chúng ta sẽ có một mật khẩu được tạo ngẫu nhiên

Chúng ta có thể kết hợp chúng thành một hàm sẽ trả về một chuỗi mật khẩu ngẫu nhiên

const y = Math.random()*10
7

Gọi

0 <= y < 10
25 sẽ trả về một mật khẩu ngẫu nhiên vượt qua ba quy tắc ở trên

const y = Math.random()*10
8

Tôi đã kết nối chức năng này với một nút HTML để bạn có thể thử tạo một số mật khẩu ngẫu nhiên bằng cách nhấn nút trong bản demo CodePen bên dưới

Xem Bút
Mật khẩu ngẫu nhiên – SitePoint của SitePoint (@SitePoint)
trên CodePen.

Một điều cần lưu ý là tất cả các hàm chúng tôi đã viết sử dụng hàm

0 <= y < 10
03 mà chúng tôi đã viết lúc đầu như thế nào. Ví dụ, hàm
0 <= y < 10
25 mà chúng ta vừa viết bao gồm các hàm
0 <= y < 10
03,
0 <= y < 10
20 và
0 <= y < 10
12… và hàm
0 <= y < 10
12 sử dụng hàm
0 <= y < 10
09. Đây là nền tảng của lập trình. sử dụng các hàm làm khối xây dựng cho các hàm phức tạp hơn

kết thúc

Chúng tôi đã thảo luận về cách tạo số ngẫu nhiên trong JavaScript hữu ích. Tôi hy vọng bạn tìm thấy hướng dẫn này hữu ích. Chức năng

0 <= y < 10
03 chắc chắn là một chức năng hữu ích cần có trong tủ khóa của bạn và sẽ giúp bạn thêm một số tính ngẫu nhiên vào các dự án của mình

Bạn có thể xem tất cả các ví dụ trong bài viết này trong bản demo CodePen sau

Xem Bút
Tính ngẫu nhiên – SitePoint theo SitePoint (@SitePoint)
trên CodePen.

đọc liên quan

  • Cách chuyển đổi số thành thứ tự trong JavaScript
  • Một chức năng tiện ích để đệm chuỗi và số
  • Vui với những con số JavaScript

Chia sẻ bài viết này

JavaScript Math có thực sự ngẫu nhiên không?

Darren Jones

Darren Jones là một lập trình viên tự học, thích viết mã bằng JavaScript, Haskell và Ruby. Ông là tác giả của Learn to Code using JavaScript, JavaScript. Làm quen với Ninja và Khởi động Sinatra. Anh ấy cũng là người tạo ra Nanny State, một giải pháp thay thế nhỏ cho React. Anh ấy dạy Toán và Tin học tại một trường trung học địa phương ở Manchester và có thể được tìm thấy trên Twitter @daz4126

Java Math có thực sự ngẫu nhiên không?

Thật bất ngờ, câu trả lời là Toán. random() không thực sự tạo ra một số ngẫu nhiên .

JavaScript Math có an toàn không?

Ghi chú. Toán. random() không cung cấp các số ngẫu nhiên được bảo mật bằng mật mã . Không sử dụng chúng cho bất cứ điều gì liên quan đến bảo mật. Thay vào đó, hãy sử dụng API Web Crypto và chính xác hơn là cửa sổ. tiền điện tử. phương thức getRandomValues().

Toán ngẫu nhiên () có thiên vị không?

Vấn đề với cách tiếp cận này là nó thiên vị . Có những con số được trả về có nhiều khả năng xảy ra hơn những con số khác. Để hiểu điều này, bạn cần hiểu rằng Toán học. random() là RNG 32 bit trong Chrome và Safari và RNG 53 bit trong Edge và Firefox.

Tại sao Toán ngẫu nhiên không ngẫu nhiên?

random() được triển khai bằng trình tạo số giả ngẫu nhiên (PRNG). Điều này có nghĩa là số ngẫu nhiên được lấy từ trạng thái bên trong, được xử lý bằng thuật toán xác định cho mọi số ngẫu nhiên mới . Nó có vẻ ngẫu nhiên đối với người dùng vì thuật toán được điều chỉnh theo cách nó xuất hiện như vậy.