Tạo số ngẫu nhiên duy nhất trong JavaScript bằng cách sử dụng Sets

theanh

Administrator
Nhân viên
JavaScript có rất nhiều hàm tích hợp cho phép bạn thực hiện nhiều thao tác khác nhau. Một trong những hàm tích hợp này là phương thức Math.random(), tạo ra một số dấu phẩy động ngẫu nhiên sau đó có thể được xử lý thành số nguyên.

Tuy nhiên, nếu bạn muốn tạo một chuỗi số ngẫu nhiên duy nhất và tạo thêm nhiều hiệu ứng ngẫu nhiên trong mã của mình, bạn sẽ cần phải tự đưa ra giải pháp tùy chỉnh vì phương thức Math.random() không thể tự thực hiện điều đó cho bạn.

Trong bài viết này, chúng ta sẽ tìm hiểu cách giải quyết vấn đề này và tạo một chuỗi số ngẫu nhiên duy nhất bằng cách sử dụng đối tượng Set trong JavaScript, sau đó chúng ta có thể sử dụng đối tượng này để tạo thêm nhiều hiệu ứng ngẫu nhiên trong mã của mình.

Lưu ý: Bài viết này giả định rằng bạn biết cách tạo số ngẫu nhiên trong JavaScript, cũng như cách làm việc với tập hợp và mảng.

Tạo một chuỗi số ngẫu nhiên duy nhất Số​

Một trong những cách để tạo ra một chuỗi số ngẫu nhiên duy nhất trong JavaScript là sử dụng các đối tượng Set. Lý do tại sao chúng ta sử dụng các tập hợp là vì các phần tử của một tập hợp là duy nhất. Chúng ta có thể lặp lại việc tạo và chèn các số nguyên ngẫu nhiên vào các tập hợp cho đến khi chúng ta có được số lượng số nguyên mong muốn.

Vì các tập hợp không cho phép các phần tử trùng lặp nên chúng sẽ đóng vai trò như một bộ lọc để loại bỏ tất cả các số trùng lặp được tạo ra và chèn vào chúng để chúng ta có được một tập hợp các số nguyên duy nhất.

Đây là cách chúng ta sẽ tiếp cận công việc:
  1. Tạo một đối tượng Set.
  2. Xác định số lượng số ngẫu nhiên cần tạo ra và phạm vi số nào cần sử dụng.
  3. Tạo từng số ngẫu nhiên và ngay lập tức chèn các số vào Set cho đến khi Set được điền bằng một số lượng nhất định các số đó.
Sau đây là một ví dụ nhanh về cách kết hợp mã:
Mã:
function generateRandomNumbers(count, min, max) { // 1: Tạo một đối tượng `Set` let uniqueNumbers = new Set(); while (uniqueNumbers.size < count) { // 2: Tạo từng số ngẫu nhiên uniqueNumbers.add(Math.floor(Math.random() * (max - min + 1)) + min); } // 3: Chèn ngay các số đó vào Set... return Array.from(uniqueNumbers);}// ...đặt số lượng số cần tạo từ một phạm vi nhất địnhconsole.log(generateRandomNumbers(5, 5, 10));
Mã này thực hiện tạo một đối tượng Set mới, sau đó tạo và thêm các số ngẫu nhiên vào set cho đến khi số lượng số nguyên mong muốn của chúng ta được đưa vào set. Lý do tại sao chúng ta trả về một mảng là vì chúng dễ làm việc hơn.

Tuy nhiên, một điều cần lưu ý là số lượng số nguyên bạn muốn tạo (được biểu thị bằng count trong mã) phải nhỏ hơn giới hạn trên của phạm vi của bạn cộng với một (được biểu thị bằng max + 1 trong mã). Nếu không, mã sẽ chạy mãi mãi. Bạn có thể thêm câu lệnh if vào mã để đảm bảo rằng điều này luôn đúng:
Mã:
function generateRandomNumbers(count, min, max) { // câu lệnh if kiểm tra xem `count` có nhỏ hơn `max + 1` không if (count > max + 1) { return "count không thể lớn hơn giới hạn trên của phạm vi"; } else { let uniqueNumbers = new Set(); while (uniqueNumbers.size < count) { uniqueNumbers.add(Math.floor(Math.random() * (max - min + 1)) + min); } return Array.from(uniqueNumbers); }}console.log(generateRandomNumbers(5, 5, 10));

Sử dụng Chuỗi Số Ngẫu Nhiên Duy Nhất làm Chỉ mục Mảng​

Tạo một chuỗi số ngẫu nhiên là một việc. Sử dụng chúng lại là một chuyện khác.

Có thể sử dụng một chuỗi số ngẫu nhiên với các mảng mở ra rất nhiều khả năng: bạn có thể sử dụng chúng để xáo trộn danh sách phát trong ứng dụng âm nhạc, lấy mẫu dữ liệu ngẫu nhiên để phân tích hoặc, như tôi đã làm, xáo trộn các ô trong trò chơi trí nhớ.

Chúng ta hãy lấy mã từ ví dụ cuối cùng và làm việc dựa trên nó để trả về các chữ cái ngẫu nhiên trong bảng chữ cái. Đầu tiên, chúng ta sẽ xây dựng một mảng các chữ cái:
Mã:
const englishAlphabets = [ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];// phần còn lại của mã
Sau đó, chúng ta ánh xạ các chữ cái trong phạm vi số:
Mã:
const englishAlphabets = [ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];// generateRandomNumbers()const randomAlphabets = randomIndexes.map((index) => englishAlphabets[index]);
Trong mã gốc, hàm generateRandomNumbers() được ghi vào bảng điều khiển. Lần này, chúng ta sẽ xây dựng một biến mới gọi hàm để randomAlphabets có thể sử dụng:
Mã:
const englishAlphabets = [ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];// generateRandomNumbers()const randomIndexes = generateRandomNumbers(5, 0, 25);const randomAlphabets = randomIndexes.map((index) => englishAlphabets[index]);
Bây giờ chúng ta có thể ghi lại đầu ra vào bảng điều khiển như chúng ta đã làm trước đó để xem kết quả:
Mã:
const englishAlphabets = [ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];// generateRandomNumbers()const randomIndexes = generateRandomNumbers(5, 0, 25);const randomAlphabets = randomIndexes.map((index) => englishAlphabets[index]);console.log(randomAlphabets);
Và khi chúng ta đưa định nghĩa hàm generateRandomNumbers() trở lại, chúng ta sẽ nhận được mã cuối cùng:
Mã:
const englishAlphabets = [ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];hàm generateRandomNumbers(count, min, max) { if (count > max + 1) { return "count không được lớn hơn giới hạn trên của phạm vi"; } else { let uniqueNumbers = new Set(); while (uniqueNumbers.size < count) { uniqueNumbers.add(Math.floor(Math.random() * (max - min + 1)) + min); } return Array.from(uniqueNumbers); }}const randomIndexes = generateRandomNumbers(5, 0, 25);const randomAlphabets = randomIndexes.map((index) => englishAlphabets[index]);console.log(randomAlphabets);
Vì vậy, trong ví dụ này, chúng ta đã tạo một mảng bảng chữ cái mới bằng cách chọn ngẫu nhiên một số chữ cái trong mảng englishAlphabets của mình.

Bạn có thể truyền vào đối số đếm englishAlphabets.length cho hàm generateRandomNumbers nếu bạn muốn xáo trộn các phần tử trong mảng englishAlphabets. Đây là những gì tôi muốn nói:
Mã:
generateRandomNumbers(englishAlphabets.length, 0, 25);

Kết thúc​

Trong bài viết này, chúng ta đã thảo luận về cách tạo ngẫu nhiên trong JavaScript bằng cách đề cập đến cách tạo một chuỗi số ngẫu nhiên duy nhất, cách sử dụng các số ngẫu nhiên này làm chỉ mục cho mảng và một số ứng dụng thực tế của ngẫu nhiên.

Cách tốt nhất để học bất cứ điều gì trong phát triển phần mềm là tiếp thu nội dung và củng cố bất kỳ kiến thức nào bạn có được từ nội dung đó bằng cách thực hành. Vì vậy, đừng dừng lại ở đây. Hãy chạy các ví dụ trong hướng dẫn này (nếu bạn chưa làm như vậy), thử nghiệm chúng, đưa ra các giải pháp độc đáo của riêng bạn và cũng đừng quên chia sẻ thành quả tuyệt vời của bạn. Xin chào!
 
Back
Bên trên