Tạo số ngẫu nhiên

Acrafto Team Toán học
Cập nhật
Kiểu dựng sẵn
Mọi thứ chạy trong trình duyệt của bạn. Không có con số nào rời khỏi thiết bị.

Công cụ tạo số ngẫu nhiên hoạt động như thế nào?

Công cụ này cung cấp cho bạn hai nguồn ngẫu nhiên, và bạn chọn nguồn phù hợp với mục đích của mình.

Ngẫu nhiên an toàn lấy entropy từ hệ điều hành của bạn thông qua Web Crypto API (crypto.getRandomValues()). Nó không thể đoán trước và không thể lặp lại — lựa chọn đúng đắn cho một lần quay số thực sự, nơi không ai có thể đoán trước kết quả.

Seed (hạt giống) biến bất kỳ đoạn văn bản nào bạn nhập thành trạng thái khởi đầu cho một bộ tạo số xác định (xoshiro128**). Cùng một seed luôn cho ra cùng một dãy số, vì vậy bất kỳ ai cũng có thể lặp lại lần quay số của bạn và xác nhận rằng bạn đã nhận được đúng như những gì bạn nói.

Cả hai chế độ đều chạy hoàn toàn trong trình duyệt của bạn. Không có số nào từng được gửi tới máy chủ.

Không có sai lệch modulo

Hầu hết các bộ tạo số đơn giản ánh xạ một giá trị 32-bit ngẫu nhiên vào phạm vi của bạn bằng value % range. Khi phạm vi không chia hết đều cho 2³², các số nhỏ nhất sẽ xuất hiện thường xuyên hơn một chút so với phần còn lại. Qua hàng nghìn lần quay, điều này trở nên đo lường được.

Công cụ này sử dụng lấy mẫu loại bỏ (rejection sampling) thay thế: những giá trị rơi vào phần đuôi không đều sẽ bị loại bỏ và rút lại. Mọi số trong phạm vi của bạn đều có cơ hội hoàn toàn như nhau. Bạn có thể tự kiểm chứng điều này bằng bài kiểm tra độ đồng đều tích hợp sẵn.

Công cụ này có thể làm gì

Phạm vi

  • Tối thiểu và tối đa — bất kỳ phạm vi số nguyên hay số thập phân nào, kể cả giá trị âm
  • Số lượng số — từ 1 đến 1.000.000 trong một lần tạo
  • Không lặp lại — mỗi số chỉ xuất hiện tối đa một lần, giống như một lần quay số thực sự
  • Sắp xếp — theo thứ tự quay, tăng dần hoặc giảm dần; việc sắp xếp không hề ảnh hưởng đến tính ngẫu nhiên
  • Bước nhảy (step) — giới hạn kết quả chỉ là bội số của một giá trị, ví dụ chỉ ra 0, 5, 10, 15
  • Loại trừ số — liệt kê các giá trị không bao giờ được rút ra

Chế độ

  • Nguồn ngẫu nhiên — an toàn (Web Crypto) hoặc seed (có thể tái lập)
  • Seed — bất kỳ văn bản nào; cùng một seed luôn phát lại đúng lần quay đó
  • Phân phối — đều, chuẩn (Gaussian), mũ, Poisson, tam giác, nhị thức
  • Trọng số — cho các số được chọn cơ hội cao hơn, viết theo dạng number:weight
  • Ký hiệu xúc xắc — 3d6+2, d20, 2d20kh1 cho lợi thế (advantage), 4d6dl1 cho việc lăn chỉ số nhân vật

Đầu ra

  • Dấu phân cách — dấu phẩy, dấu cách, dấu chấm phẩy, tab, xuống dòng, hoặc bất kỳ ký tự nào bạn nhập
  • Hệ số — thập phân, nhị phân, bát phân, thập lục phân, hoặc cơ số 36
  • Đệm số 0 — biến 7 thành 007 cho số vé hoặc mã ID
  • Tiền tố và hậu tố — bọc mỗi số trong đoạn văn bản cố định
  • Mẫu (template) — {n} là số, {i} là vị trí của nó, vì vậy user{n} trở thành user42
  • Sao chép dưới dạng — văn bản thuần, CSV, JSON, hoặc bảng Markdown

Thống kê

Mỗi lần tạo đều được tóm tắt trực tiếp: tổng, trung bình, trung vị, nhỏ nhất, lớn nhất, độ lệch chuẩn, cùng với số lượng kết quả chẵn, lẻ hoặc số nguyên tố. Biểu đồ histogram cho thấy hình dạng của phân phối, và một kiểm định chi bình phương (chi-square) cho biết liệu kết quả có thực sự khớp với phân phối đều hay không.

Lịch sử

50 lần tạo gần nhất được lưu trong trình duyệt của bạn, cùng với các cài đặt đã tạo ra chúng — chỉ cần một cú nhấp chuột để khôi phục bất kỳ lần nào trong số đó. Các cấu hình bạn dùng thường xuyên có thể được lưu thành preset có tên, và toàn bộ danh sách có thể xuất ra tệp JSON để nhập lại trên máy khác. Không có gì được lưu trữ ở nơi nào khác ngoài trình duyệt này.

Bàn phím

Nhấn phím cách (Space) hoặc R để tạo lại mà không cần chạm chuột.

Các preset nhanh

PresetPhạm viSố lượngỨng dụng
🎲 Xúc xắc1–61Trò chơi cờ bàn, ra quyết định
🪙 Đồng xu0–11Ngửa hoặc sấp
🎰 Xổ số1–496Duy nhất, có sắp xếp, giống một lần quay số thực
💯 1–1001–1001Phần trăm, chia A/B
🔢 Mã PIN0–94Bốn chữ số, cho phép lặp lại

Các lần quay có thể tái lập

Chế độ seed tồn tại cho những lúc mà “hãy tin tôi, nó ngẫu nhiên thật” là chưa đủ.

Chọn một seed mà mọi người có thể thống nhất trước — một ngày tháng, một hashtag, giá đóng cửa của thứ gì đó công khai — và công bố nó trước khi quay số. Sau đó bất kỳ ai cũng có thể nhập cùng một seed với cùng cài đặt và nhận được kết quả giống hệt. Bạn không chứng minh rằng các số là không thể đoán trước; bạn chứng minh rằng bạn đã không quay lại nhiều lần cho đến khi thích kết quả.

Đây cũng là cách để làm cho tính ngẫu nhiên trở nên lặp lại được trong công việc cần được kiểm tra: một kế hoạch lấy mẫu mà đồng nghiệp có thể chạy lại, một bộ dữ liệu kiểm thử (fixture) giữ nguyên ổn định trong suốt một bộ test, một bài tập trên lớp nơi mỗi học sinh nhận được cùng một bộ dữ liệu “ngẫu nhiên”.

Chọn một phân phối

Đều (Uniform) cho mọi số trong phạm vi cùng một cơ hội. Đây là điều mà người ta thường nghĩ đến khi nói “ngẫu nhiên”, và đây là lựa chọn mặc định.

Các phân phối khác tập trung kết quả quanh một giá trị, giống như cách các đại lượng trong thực tế thường có xu hướng:

  • Chuẩn (Gaussian) — chiều cao, sai số đo lường, điểm kiểm tra. Đặt một giá trị trung bình và độ lệch chuẩn.
  • Mũ (Exponential) — thời gian chờ giữa các sự kiện độc lập.
  • Poisson — số lượng sự kiện trong một khoảng thời gian cố định: lượt khách đến mỗi giờ, số lỗi mỗi lô hàng.
  • Tam giác (Triangular) — khi bạn biết giá trị tối thiểu, tối đa và giá trị có khả năng xảy ra nhất nhưng không biết gì thêm. Thường dùng trong ước tính dự án.
  • Nhị thức (Binomial) — số lần thành công trên một số lượng phép thử cố định với xác suất cố định.

Mọi phân phối đều bị giới hạn (clip) trong phạm vi bạn đặt, vì vậy một đuôi phân phối Gaussian dài không thể vượt ra ngoài giá trị tối thiểu và tối đa của bạn.

Số ngẫu nhiên được sử dụng ở đâu

Trò chơi và giải trí

  • Trò chơi cờ bàn — tung xúc xắc, xác định thứ tự chơi
  • Trò chơi nhập vai (RPG) trên bàn — 4d6dl1 cho chỉ số nhân vật, 2d20kh1 cho lợi thế
  • Chương trình tặng quà (giveaway) — chọn người thắng, kèm seed để người tham gia có thể kiểm chứng
  • Câu đố — sắp xếp thứ tự câu hỏi ngẫu nhiên

Thống kê và khoa học

  • Lấy mẫu — rút một mẫu từ quần thể mà không lặp lại
  • Kiểm thử A/B — phân bổ người tham gia vào các nhóm
  • Mô phỏng Monte Carlo — ước tính xác suất qua việc lặp lại
  • Bootstrapping — lấy mẫu lại để ước tính độ bất định

Phát triển phần mềm

  • Dữ liệu kiểm thử — hàng triệu giá trị, được tạo ở chế độ nền để trang vẫn phản hồi mượt
  • Fixtures — dùng seed, để một bài test thất bại thì thất bại giống hệt nhau hai lần
  • ID ngẫu nhiên — kèm đệm số, tiền tố, hoặc mẫu (template)
  • Kiểm thử tải (load testing) — định danh theo mẫu như user{n}@example.com

Số ngẫu nhiên thực sự so với số giả ngẫu nhiên

Math.random()crypto.getRandomValues()Seed (xoshiro128**)
LoạiGiả ngẫu nhiênAn toàn về mặt mật mãGiả ngẫu nhiên, xác định
Nguồn entropyHạt giống do engine chọnCSPRNG của hệ thốngVăn bản seed của bạn
Có thể dự đoán?Có thểKhôngCó, theo thiết kế
Có thể lặp lại?KhôngKhôngLuôn luôn
Phù hợp cho bảo mậtKhôngCóKhông
Phù hợp cho thống kêTùy trường hợpCóCó
Phù hợp cho quay số có thể kiểm chứngKhôngKhôngCó

Math.random() không được sử dụng ở bất kỳ đâu trong công cụ này.

Quay số không lặp lại

Khi bật Không lặp lại, mỗi số trong phạm vi chỉ xuất hiện tối đa một lần. Lý tưởng cho:

  • Chương trình tặng quà — không ai có thể thắng hai lần
  • Hoán vị — xáo trộn một tập hợp phần tử
  • Bingo — gọi các số đã được gọi thì không gọi lại
  • Xổ số — sáu số khác nhau từ 1 đến 49

Việc quay số sử dụng thuật toán xáo trộn Fisher–Yates một phần, vì vậy yêu cầu 6 số duy nhất trong một triệu cũng nhanh như yêu cầu 6 số trong 49 — nó không bao giờ lặp vòng để tránh trùng lặp. Nếu bạn yêu cầu nhiều số duy nhất hơn số lượng mà phạm vi có thể cung cấp, công cụ sẽ báo cho bạn biết thay vì bị treo.

Xuất kết quả

Sao chép các số dưới dạng văn bản thuần với bất kỳ dấu phân cách nào bạn muốn, dưới dạng CSV cho bảng tính, dưới dạng JSON cho mã nguồn, hoặc dưới dạng bảng Markdown cho tài liệu. Các lần tạo rất lớn được giữ nguyên đầy đủ trong bộ nhớ và sao chép đầy đủ, dù chỉ vài nghìn số đầu tiên được hiển thị trên màn hình.

Tạo số ngẫu nhiên trong mã nguồn của riêng bạn

JavaScript / TypeScript

// Số nguyên an toàn về mặt mật mã trong [min, max], không bị sai lệch modulo.
// Công thức đơn giản `value % range` sẽ ưu ái các số nhỏ khi range không
// chia hết đều cho 2**32 - vì vậy ta loại bỏ các giá trị rơi vào phần đuôi không đều.
function randomInt(min, max) {
  const range = max - min + 1;
  const limit = Math.floor(0x100000000 / range) * range;
  const arr = new Uint32Array(1);
  let value;
  do {
    crypto.getRandomValues(arr);
    value = arr[0];
  } while (value >= limit);
  return min + (value % range);
}

Python

import random
import secrets

# An toàn về mặt mật mã, không bị sai lệch modulo
n = secrets.randbelow(max - min + 1) + min

# Có thể tái lập: cùng một seed luôn cho cùng một dãy số
rng = random.Random('my-seed')
n = rng.randint(min, max)

# Không lặp lại
sample = random.sample(range(min, max + 1), count)

PHP

// An toàn về mặt mật mã (PHP 7+), không bị sai lệch modulo
$n = random_int($min, $max);

// Có thể tái lập
mt_srand(crc32('my-seed'));
$n = mt_rand($min, $max);

Câu hỏi thường gặp (FAQ)

Kết quả có thực sự ngẫu nhiên không? Ở chế độ an toàn thì có. Nó đến từ crypto.getRandomValues(), một bộ tạo số an toàn về mặt mật mã được cấp entropy từ nguồn của hệ điều hành. Kết quả được phân bố đều và không thể đoán trước. Chế độ seed cố tình mang tính chất ngược lại: nó có thể tái lập, và đó chính là mục đích của nó.
Tôi có thể tạo bao nhiêu số cùng một lúc? Tối đa 1.000.000 số. Các lần tạo trên 50.000 số được tính toán trong một worker chạy nền để trang vẫn phản hồi mượt, và màn hình hiển thị 2.000 số đầu tiên cùng số lượng còn lại — việc sao chép vẫn cho bạn toàn bộ kết quả.
Tôi có thể tạo số âm không? Có. Chỉ cần đặt giá trị tối thiểu là số âm. Toàn bộ phạm vi số của JavaScript đều hoạt động được, kể cả phạm vi âm ở cả hai đầu.
Việc sắp xếp có ảnh hưởng đến tính ngẫu nhiên không? Không. Các số được rút ra trước rồi mới sắp xếp sau. Việc sắp xếp chỉ thay đổi thứ tự bạn nhìn thấy chúng.
Cùng một seed có cho cùng một dãy số vào ngày mai không? Có, và trên bất kỳ thiết bị hay trình duyệt nào khác. Bộ tạo số theo seed hoàn toàn xác định và chỉ phụ thuộc vào seed cùng các cài đặt của bạn.
Bài kiểm tra độ đồng đều cho tôi biết điều gì? Nó chạy một kiểm định chi bình phương so sánh tần suất mỗi số thực sự xuất hiện với tần suất lẽ ra nó phải xuất hiện. Nếu giá trị thống kê thấp hơn giá trị tới hạn, kết quả phù hợp với một phân phối đều. Cần một phạm vi tương đối hẹp và đủ số lần tạo — ít nhất năm lần cho mỗi giá trị có thể — để đưa ra kết luận có ý nghĩa.
Trọng số hoạt động như thế nào? Viết chúng theo dạng cặp number:weight, ví dụ 1:5, 2:1, 3:1. Ở đây số 1 có khả năng xuất hiện gấp năm lần so với 2 hoặc 3. Những số bạn không liệt kê sẽ có trọng số bằng 0 và không bao giờ được rút ra.
Những ký hiệu xúc xắc nào được hỗ trợ? 3d6 tung ba viên xúc xắc sáu mặt. Thêm một số điều chỉnh với 3d6+2. Giữ lại hoặc loại bỏ xúc xắc với kh, kl, dh, dl — vì vậy 2d20kh1 giữ lại giá trị cao nhất trong hai lần tung d20 (lợi thế) và 4d6dl1 loại bỏ giá trị thấp nhất trong bốn lần tung d6.
Lịch sử của tôi có được lưu trữ ở đâu không? Chỉ trong trình duyệt này, ở bộ nhớ cục bộ (local storage). Nó không bao giờ được gửi tới máy chủ, không đồng bộ sang thiết bị khác, và sẽ biến mất nếu bạn xóa dữ liệu trang web. Xuất ra JSON nếu bạn muốn giữ lại hoặc di chuyển nó.

Tôi sẽ đánh giá cao nếu bạn có thể chia sẻ những trang này với bạn bè, đánh dấu trang hoặc liên kết đến chúng. Cảm ơn! 🙏