Tạo số ngẫu nhiên (Random) trong JavaScript

Javascript căn bản | by Học Javascript

Trong lập trình, số ngẫu nhiên đóng vai trò quan trọng trong nhiều lĩnh vực như trò chơi điện tử, bảo mật, thống kê và trí tuệ nhân tạo. JavaScript cung cấp nhiều phương pháp để tạo số ngẫu nhiên, trong đó phổ biến nhất là Math.random(). Tuy nhiên, để tạo số ngẫu nhiên trong một khoảng xác định hoặc đảm bảo tính bảo mật cao hơn, chúng ta cần áp dụng các công thức và phương pháp nâng cao. Bài viết này sẽ giới thiệu cách sử dụng Math.random(), cách tạo số nguyên ngẫu nhiên, cũng như ứng dụng số ngẫu nhiên trong thực tế.

Tại sao cần tạo số ngẫu nhiên trong JavaScript?

Số ngẫu nhiên đóng vai trò quan trọng trong nhiều lĩnh vực lập trình. Dưới đây là một số lý do chính khiến chúng ta cần sử dụng số ngẫu nhiên trong JavaScript:

Dùng trong trò chơi, bốc thăm, sinh ID ngẫu nhiên

  • Trong trò chơi điện tử, số ngẫu nhiên được sử dụng để tạo ra sự kiện bất ngờ như sinh quái vật ngẫu nhiên, rơi vật phẩm, hoặc quyết định hành động của AI.
  • Trong các ứng dụng bốc thăm may mắn, số ngẫu nhiên giúp đảm bảo tính công bằng khi chọn người trúng giải.
  • Khi tạo ID ngẫu nhiên cho người dùng hoặc đối tượng (ví dụ: mã đơn hàng, mã xác thực), số ngẫu nhiên giúp tạo ra các giá trị duy nhất, tránh trùng lặp.

Ví dụ:

// Sinh số ngẫu nhiên từ 1 đến 100 cho trò chơi
const randomNumber = Math.floor(Math.random() * 100) + 1;
console.log(`Số ngẫu nhiên: ${randomNumber}`);

Ứng dụng trong bảo mật, mã hóa dữ liệu

  • Trong bảo mật, số ngẫu nhiên được sử dụng để tạo mã OTP (One-Time Password) nhằm xác thực người dùng.
  • Hệ thống mã hóa dữ liệu cần số ngẫu nhiên để tạo khóa mã hóa, đảm bảo rằng mỗi lần mã hóa có một kết quả khác nhau.
  • Các thuật toán như CSRF token (Cross-Site Request Forgery) hoặc session ID đều sử dụng số ngẫu nhiên để ngăn chặn tấn công từ hacker.

Ví dụ:

// Tạo mã OTP 6 chữ số ngẫu nhiên
const otp = Math.floor(100000 + Math.random() * 900000);
console.log(`Mã OTP: ${otp}`);

Sử dụng trong thống kê và mô phỏng

  • Trong lĩnh vực thống kê, số ngẫu nhiên được sử dụng để mô phỏng dữ liệu thực tế, giúp phân tích xu hướng và đưa ra dự đoán.
  • Trong trí tuệ nhân tạo (AI) và học máy (Machine Learning), số ngẫu nhiên giúp tạo bộ dữ liệu huấn luyện hoặc khởi tạo trọng số mạng nơ-ron.
  • Các mô phỏng vật lý, tài chính và khoa học đều cần số ngẫu nhiên để tái hiện môi trường thực tế.

Ví dụ:

// Tạo mảng 10 số ngẫu nhiên để mô phỏng dữ liệu thống kê
const randomData = Array.from({ length: 10 }, () => Math.random());
console.log(`Dữ liệu mô phỏng:`, randomData);

Math.random() – Hàm tạo số ngẫu nhiên cơ bản trong JavaScript

Math.random() là một phương thức tích hợp trong JavaScript, giúp tạo ra một số thập phân ngẫu nhiên trong khoảng [0, 1), tức là từ 0 đến gần 1, nhưng không bao gồm 1.

Ví dụ đơn giản:

console.log(Math.random()); // Kết quả: Một số thập phân ngẫu nhiên, ví dụ: 0.675892

Mỗi lần chạy, kết quả của Math.random() sẽ thay đổi, đảm bảo tính ngẫu nhiên.

Đặc điểm của Math.random()

Luôn nhỏ hơn 1: Kết quả luôn nằm trong khoảng từ 0 đến < 1, tức là giá trị có thể là 0 nhưng không thể là 1.

Giá trị thay đổi mỗi lần chạy: Vì đây là một hàm tạo số ngẫu nhiên, kết quả sẽ khác nhau mỗi lần bạn chạy chương trình.

Không cần tham số: Math.random() không yêu cầu tham số đầu vào và có thể sử dụng trực tiếp.

Ví dụ chạy nhiều lần:

console.log(Math.random()); // Ví dụ: 0.123456
console.log(Math.random()); // Ví dụ: 0.987654
console.log(Math.random()); // Ví dụ: 0.456789

Hạn chế của Math.random()

Không tạo số nguyên trực tiếp

  • Math.random() chỉ trả về một số thập phân từ 0 đến <1, nó không thể tạo trực tiếp một số nguyên.
  • Nếu muốn tạo số nguyên, bạn cần kết hợp với các phương thức khác như Math.floor(), Math.ceil(), hoặc Math.round().

Không tạo số trong khoảng cụ thể

  • Mặc định, Math.random() chỉ tạo số trong khoảng [0, 1).
  • Để tạo số trong một khoảng bất kỳ (ví dụ: từ 10 đến 100), cần nhân với một giá trị khác và dùng các hàm làm tròn.

Ví dụ minh họa hạn chế:

console.log(Math.random()); // Luôn chỉ nằm trong khoảng 0 đến <1, không thể có số nguyên
console.log(Math.random() * 10); // Vẫn là số thập phân, chưa phải số nguyên

Cách khắc phục hạn chế

Dù có một số hạn chế, Math.random() vẫn rất hữu ích khi kết hợp với các phương thức khác để tạo ra số nguyên hoặc số trong một khoảng nhất định. Chúng ta sẽ tìm hiểu kỹ hơn về cách làm này trong các phần tiếp theo.

Ví dụ: Tạo số nguyên từ 1 đến 10 bằng cách làm tròn:

let randomInt = Math.floor(Math.random() * 10) + 1;
console.log(randomInt); // Kết quả: Một số nguyên từ 1 đến 10

Math.random() là một phương thức mạnh mẽ để tạo số ngẫu nhiên, nhưng để tạo số nguyên hoặc số trong một khoảng cụ thể, chúng ta cần sử dụng thêm các phương thức như Math.floor(), Math.ceil().

Tạo số ngẫu nhiên trong một khoảng nhất định trong JavaScript

Mặc định, Math.random() chỉ tạo số trong khoảng [0, 1), nhưng chúng ta có thể biến đổi nó để tạo số trong bất kỳ khoảng nào bằng cách sử dụng một công thức chung.

Tạo số thập phân ngẫu nhiên trong khoảng [min, max)

Nếu bạn muốn tạo một số thập phân trong một khoảng [min, max) (bao gồm min nhưng không bao gồm max), bạn có thể sử dụng công thức sau:

let randomDecimal = Math.random() * (max - min) + min;

Ví dụ 1: Tạo số thập phân từ 5 đến 10

let min = 5;
let max = 10;
let randomDecimal = Math.random() * (max - min) + min;
console.log(randomDecimal); // Kết quả: Một số thập phân trong khoảng [5, 10)

Giải thích công thức:

  • Math.random() trả về một số từ 0 đến <1.
  • (max - min) giúp mở rộng phạm vi thành từ 0 đến max-min.
  • + min giúp dịch chuyển phạm vi bắt đầu từ min thay vì 0.

Ví dụ kết quả chạy nhiều lần:

5.843216
7.129003
9.455678

Mỗi lần chạy chương trình, số sẽ thay đổi nhưng luôn nằm trong khoảng từ 5 đến <10.

Tạo số nguyên ngẫu nhiên trong khoảng [min, max]

Nếu muốn tạo một số nguyên trong khoảng [min, max] (bao gồm cả minmax), chúng ta cần kết hợp Math.random() với Math.floor():

let randomInt = Math.floor(Math.random() * (max - min + 1)) + min;

Tại sao cần +1 trong công thức?

  • Nếu không có +1, kết quả tối đa có thể chỉ đạt max - 1, chứ không bao gồm max.
  • Thêm +1 giúp mở rộng phạm vi để bao gồm cả giá trị max.

Ví dụ 2: Tạo số nguyên từ 1 đến 10

let min = 1;
let max = 10;
let randomInt = Math.floor(Math.random() * (max - min + 1)) + min;
console.log(randomInt); // Kết quả: Một số nguyên từ 1 đến 10

Ví dụ kết quả chạy nhiều lần:

5
9
2
10
1

Mỗi lần chạy chương trình, số ngẫu nhiên sẽ thay đổi, nhưng luôn nằm trong khoảng từ 1 đến 10.

Ví dụ 3: Sinh số ngẫu nhiên trong khoảng [100, 200]

let min = 100;
let max = 200;
let randomInt = Math.floor(Math.random() * (max - min + 1)) + min;
console.log(randomInt); // Kết quả: Một số nguyên từ 100 đến 200

Ví dụ kết quả chạy nhiều lần:

123
178
156
101
200

Mỗi lần chạy, chương trình sẽ tạo một số nguyên bất kỳ từ 100 đến 200.

Ứng dụng Math.random() trong JavaScript

Hàm Math.random() có nhiều ứng dụng trong thực tế, từ trò chơi, bảo mật, đến thống kê và mô phỏng. Dưới đây là một số ví dụ minh họa chi tiết.

Sinh số ngẫu nhiên trong trò chơi

Số ngẫu nhiên rất quan trọng trong các trò chơi để tạo yếu tố bất ngờ, giúp game trở nên thú vị hơn.

Chọn số ngẫu nhiên cho xúc xắc (Dice Roll)

function rollDice() {
    return Math.floor(Math.random() * 6) + 1; // Tạo số từ 1 đến 6
}
console.log(rollDice()); // Kết quả: Một số ngẫu nhiên từ 1 đến 6

Ứng dụng: Xúc xắc trong cờ tỷ phú, cờ cá ngựa.

Sinh quái vật ngẫu nhiên trong game

const monsters = ["Rồng", "Yêu tinh", "Ma cà rồng", "Zombie", "Người sói"];
function randomMonster() {
    return monsters[Math.floor(Math.random() * monsters.length)];
}
console.log(randomMonster()); // Kết quả: Một loại quái vật ngẫu nhiên

Ứng dụng: Game nhập vai RPG, tạo kẻ địch ngẫu nhiên.

Bốc thăm may mắn & chọn ngẫu nhiên

Chọn một người ngẫu nhiên từ danh sách

const participants = ["An", "Bình", "Cường", "Dũng", "Hoa"];
function randomWinner() {
    return participants[Math.floor(Math.random() * participants.length)];
}
console.log(randomWinner()); // Kết quả: Một cái tên ngẫu nhiên từ danh sách

Ứng dụng: Rút thăm trúng thưởng, quay số ngẫu nhiên.

Xáo trộn mảng bằng cách chọn phần tử ngẫu nhiên (Fisher-Yates Shuffle)

function shuffleArray(arr) {
    for (let i = arr.length - 1; i > 0; i--) {
        let j = Math.floor(Math.random() * (i + 1));
        [arr[i], arr[j]] = [arr[j], arr[i]]; // Hoán đổi phần tử
    }
    return arr;
}

let numbers = [1, 2, 3, 4, 5, 6];
console.log(shuf

Ứng dụng: Xáo trộn bộ bài, trộn danh sách câu hỏi trắc nghiệm.

Tạo mã xác thực & ID ngẫu nhiên

Sinh mã OTP 6 chữ số

function generateOTP() {
    return Math.floor(100000 + Math.random() * 900000); // Số từ 100000 đến 999999
}
console.log(generateOTP()); // Kết quả: 6 chữ số ngẫu nhiên

Ứng dụng: Xác thực hai bước (2FA), đăng nhập bảo mật.

Tạo chuỗi ngẫu nhiên làm mã ID

function randomID(length) {
    let chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    let result = "";
    for (let i = 0; i < length; i++) {
        result += chars.charAt(Math.floor(Math.random() * chars.length));
    }
    return result;
}
console.log(randomID(10)); // Kết quả: Chuỗi 10 ký tự ngẫu nhiên
Ứng dụng: Sinh ID đơn hàng, tạo mã API key.

Cải thiện độ an toàn của số ngẫu nhiên trong JavaScript

Hạn chế của Math.random() trong bảo mật

  • Math.random() không thực sự ngẫu nhiên mà chỉ là giả ngẫu nhiên (pseudo-random).
  • Có thể dự đoán giá trị nếu biết thuật toán tạo số ngẫu nhiên.
  • Không phù hợp cho mã hóa, bảo mật (ví dụ: tạo mật khẩu, mã OTP quan trọng).

Giải pháp: Sử dụng crypto.getRandomValues() để tạo số ngẫu nhiên thực sự an toàn.

Sử dụng crypto.getRandomValues() để tạo số ngẫu nhiên an toàn hơn

crypto.getRandomValues() tạo số ngẫu nhiên với độ bảo mật cao, phù hợp cho mã hóa, tạo mật khẩu.

Ví dụ: Sinh số nguyên ngẫu nhiên an toàn trong khoảng [0, 255]

let array = new Uint8Array(1);
window.crypto.getRandomValues(array);
console.log(array[0]); // Kết quả: Một số từ 0 đến 255

Ví dụ: Tạo chuỗi ngẫu nhiên an toàn

function secureRandomString(length) {
    let array = new Uint8Array(length);
    window.crypto.getRandomValues(array);
    return Array.from(array, byte => byte.toString(16).padStart(2, "0")).join("");
}

console.log(secureRandomString(16)); // Kết quả: Chuỗi 16 ký tự ngẫu nhiên

Ứng dụng: Sinh mã bảo mật, khóa API.

Kết bài

Tạo số ngẫu nhiên trong JavaScript là một kỹ thuật quan trọng và có nhiều ứng dụng thực tế, từ trò chơi, bảo mật đến phân tích dữ liệu. Với Math.random(), chúng ta có thể dễ dàng tạo số ngẫu nhiên để sử dụng trong các bài toán thông thường. Tuy nhiên, khi yêu cầu tính bảo mật cao, crypto.getRandomValues() là lựa chọn tốt hơn để đảm bảo tính ngẫu nhiên thực sự.

Việc hiểu và áp dụng các phương pháp tạo số ngẫu nhiên đúng cách không chỉ giúp lập trình viên phát triển các ứng dụng hiệu quả hơn mà còn góp phần nâng cao tính bảo mật và trải nghiệm người dùng. Hãy thử nghiệm với các ví dụ và ứng dụng chúng vào dự án của bạn để thấy rõ sự hữu ích của chúng!

Bài viết liên quan

  • 2