- 1 1. Những Điều Bạn Sẽ Học Được Trong Bài Viết Này
- 1.1 1.1 Bạn Sẽ Hiểu Các Cách Chính Để Tạo Số Ngẫu Nhiên Trong Java
- 1.2 1.2 Bạn Sẽ Hiểu Các Quy Tắc Về Khoảng Giá Trị và Những Nhầm Lẫn Thường Gặp
- 1.3 1.3 Bạn Sẽ Biết Sự Khác Biệt Giữa Tính Tái Sản Xuất và Rủi Ro
- 1.4 1.4 Bạn Sẽ Có Thể Chọn “Ngẫu Nhiên An Toàn” vs. “Ngẫu Nhiên Nguy Hiểm”
- 1.5 1.5 Ngay Cả Người Mới Bắt Đầu Cũng Có Thể Giải Thích “Tại Sao Đây Là Cách Đúng”
- 2 2. “Số Ngẫu Nhiên” Có Nghĩa Gì Trong Java
- 2.1 2.1 “Random” Không Có Nghĩa Là “Hoàn Toàn Ngẫu Nhiên”
- 2.2 2.2 Pseudorandom Number Generator (PRNG) là gì?
- 2.3 2.3 Khi “Ngẫu Nhiên Có Thể Tái Tạo” Hữu Ích
- 2.4 2.4 Khi Ngẫu Nhiên KHÔNG ĐƯỢC Tái Tạo
- 2.5 2.5 “Phân Phối Đồng Nhất” Là Gì? (Cơ Bản Về Độ Lệch)
- 2.6 2.6 Các Ví Dụ Phổ Biến Ở Người Mới Về “Ngẫu Nhiên Có Độ Lệch”
- 3 3. Bắt Đầu Nhanh Với Math.random()
- 4 4. Hiểu Về Lớp Cốt Lõi java.util.Random
- 5 5. Kiểm Soát Phạm Vi Và Tính Tái Tạo Với Random
- 6 6. Tại Sao Random Không Phù Hợp Cho Bảo Mật
- 7 7. Sử Dụng SecureRandom Cho Ngẫu Nhiên Nhạy Cảm Bảo Mật
- 8 8. Các API Ngẫu Nhiên Hiện Đại: ThreadLocalRandom và RandomGenerator
- 9 9. Tổng kết: Lựa chọn API Ngẫu nhiên Phù hợp trong Java
1. Những Điều Bạn Sẽ Học Được Trong Bài Viết Này
Khi bạn cố gắng làm việc với “số ngẫu nhiên” trong Java, bạn sẽ nhanh chóng gặp nhiều lựa chọn như Math.random(), Random và SecureRandom.
Nhiều người cuối cùng lại tự hỏi, “Tôi nên dùng cái nào?”
Trong phần này, chúng ta sẽ bắt đầu bằng kết luận và làm rõ những gì bạn sẽ có thể làm được khi đọc hết bài viết. Bằng cách nắm bắt bức tranh tổng thể trước khi đi sâu vào các cơ chế chi tiết và mã nguồn, các phần sau sẽ dễ theo dõi hơn rất nhiều.
1.1 Bạn Sẽ Hiểu Các Cách Chính Để Tạo Số Ngẫu Nhiên Trong Java
Bài viết này giải thích các cách chính để tạo số ngẫu nhiên trong Java từng bước một.
Cụ thể, bạn sẽ học được:
- Một phương pháp đơn giản mà bạn có thể dùng ngay lập tức
- Một phương pháp cho phép kiểm soát lập trình nhiều hơn
- Một phương pháp cho các trường hợp mà bảo mật là quan trọng
Chúng tôi sẽ sắp xếp mọi thứ theo trường hợp sử dụng để bạn dễ dàng chọn cách tiếp cận phù hợp.
Điều đó có nghĩa là bài viết này phù hợp cho cả hai nhóm người đọc sau:
- Người mới bắt đầu muốn thử các đoạn mã mẫu
- Người muốn vượt ra ngoài “chạy được, thì ổn”
Cấu trúc được thiết kế để hỗ trợ cả hai loại độc giả này.
1.2 Bạn Sẽ Hiểu Các Quy Tắc Về Khoảng Giá Trị và Những Nhầm Lẫn Thường Gặp
Một trong những rào cản lớn nhất khi làm việc với số ngẫu nhiên là việc chọn khoảng giá trị.
Ví dụ:
- Bạn muốn một số ngẫu nhiên từ 0 đến 9
- Bạn muốn mô phỏng việc tung xúc xắc từ 1 đến 6
- Bạn muốn các số ngẫu nhiên bao gồm cả giá trị âm
Trong những trường hợp này, các câu hỏi sau thường xuất hiện liên tục:
- Giá trị giới hạn trên có được bao gồm không?
- Giá trị giới hạn dưới luôn luôn được bao gồm không?
- Tại sao tôi không nhận được các giá trị như mong đợi?
Bài viết này giải thích chúng theo một luồng thân thiện với người mới bắt đầu:
“Tại sao lại xảy ra?” → “Làm sao viết đúng?”
1.3 Bạn Sẽ Biết Sự Khác Biệt Giữa Tính Tái Sản Xuất và Rủi Ro
Số ngẫu nhiên có thể có yêu cầu trái ngược nhau tùy vào hoàn cảnh:
- Bạn muốn kết quả khác nhau mỗi lần
- Bạn muốn tái tạo lại cùng một kết quả nhiều lần
Ví dụ:
- Đối với kiểm thử và gỡ lỗi, bạn muốn tái tạo “cùng một giá trị ngẫu nhiên”
- Đối với mật khẩu và token, bạn cần “giá trị ngẫu nhiên không thể đoán trước”
Nếu bạn sử dụng chúng mà không hiểu sự khác biệt này, bạn có thể gặp các vấn đề như:
- Kiểm thử không ổn định
- Triển khai gây nguy hiểm về bảo mật
Bài viết này tách biệt rõ ràng:
“Tính ngẫu nhiên nên được tái tạo” vs. “Tính ngẫu nhiên không được tái tạo”
1.4 Bạn Sẽ Có Thể Chọn “Ngẫu Nhiên An Toàn” vs. “Ngẫu Nhiên Nguy Hiểm”
Java cung cấp nhiều tùy chọn tạo số ngẫu nhiên có vẻ giống nhau, nhưng mục đích của chúng hoàn toàn khác nhau.
- Tính ngẫu nhiên phù hợp cho trò chơi và mã mẫu
- Tính ngẫu nhiên đủ cho các ứng dụng doanh nghiệp
- Tính ngẫu nhiên bắt buộc cho các trường hợp sử dụng bảo mật
Nếu bạn dùng chúng mà không phân biệt mục đích, rất có thể bạn sẽ gặp:
- “Có vẻ hoạt động, nhưng thực tế lại nguy hiểm”
- “Mã nguồn trở thành vấn đề sau này”
Bài viết này giải thích tiêu chí quyết định kèm lý do, dưới dạng:
“Đối với trường hợp này, dùng cách này.”
1.5 Ngay Cả Người Mới Bắt Đầu Cũng Có Thể Giải Thích “Tại Sao Đây Là Cách Đúng”
Thay vì chỉ liệt kê các ví dụ mã, chúng tôi tập trung vào lý do đằng sau chúng, chẳng hạn như:
- Tại sao lại dùng phương pháp này
- Tại sao phong cách cụ thể này là đúng
- Tại sao các cách tiếp cận khác không phù hợp
Chúng tôi nhấn mạnh bối cảnh và cách suy nghĩ.
Vì vậy, bài viết này hữu ích cho những người muốn:
- Hiểu và áp dụng (không chỉ ghi nhớ)
- Đạt tới mức độ có thể giải thích cho người khác
cũng như.
2. “Số Ngẫu Nhiên” Có Nghĩa Gì Trong Java
Trước khi tạo số ngẫu nhiên trong Java, phần này sẽ sắp xếp các nền tảng cốt lõi bạn phải biết.
Nếu bạn bỏ qua phần này và chỉ sao chép mã, gần như chắc chắn sẽ gặp rắc rối sau này.
2.1 “Random” Không Có Nghĩa Là “Hoàn Toàn Ngẫu Nhiên”
Một quan niệm sai lầm phổ biến ở người mới bắt đầu là:
Số ngẫu nhiên được tạo ra trong Java không phải là “hoàn toàn ngẫu nhiên.”
Hầu hết các giá trị ngẫu nhiên được sử dụng trong Java được mô tả chính xác hơn là:
- Các số được tính toán theo các quy tắc cố định (một thuật toán)
- Chúng trông ngẫu nhiên, nhưng bên trong chúng tuân theo một mẫu
Loại ngẫu nhiên này được gọi là số giả ngẫu nhiên (đầu ra PRNG).
2.2 Pseudorandom Number Generator (PRNG) là gì?
Một pseudorandom number generator là một cơ chế:
- Bắt đầu từ một giá trị ban đầu (một seed)
- Lặp lại các phép tính toán học
- Tạo ra một chuỗi trông ngẫu nhiên
Các lợi ích chính bao gồm:
- Tạo nhanh
- Cùng một seed tái tạo cùng một chuỗi ngẫu nhiên
- Dễ xử lý trên máy tính
Mặt khác, nhược điểm bao gồm:
- Có thể dự đoán nếu thuật toán được biết
- Có thể không phù hợp cho các trường hợp sử dụng bảo mật
2.3 Khi “Ngẫu Nhiên Có Thể Tái Tạo” Hữu Ích
Nhìn thoáng qua, bạn có thể nghĩ:
Nếu cùng các giá trị ngẫu nhiên xuất hiện, chẳng phải là không ngẫu nhiên và do đó là xấu sao?
Nhưng trên thực tế, ngẫu nhiên có thể tái tạo cực kỳ quan trọng.
Ví dụ:
- Bạn muốn xác minh cùng kết quả mỗi lần trong mã kiểm tra
- Bạn muốn tái tạo báo cáo lỗi
- Bạn muốn so sánh kết quả mô phỏng
Trong những tình huống này, việc có:
- Cùng các giá trị ngẫu nhiên mỗi lần chạy
- thay vì kết quả thay đổi mỗi lần
Nhiều lớp số ngẫu nhiên Java được thiết kế với tính tái tạo này trong đầu.
2.4 Khi Ngẫu Nhiên KHÔNG ĐƯỢC Tái Tạo
Mặt khác, một số giá trị ngẫu nhiên không bao giờ được tái tạo.
Các ví dụ điển hình bao gồm:
- Tạo mật khẩu
- Token xác thực
- ID phiên
- Khóa một lần
Nếu các giá trị này là:
- Có thể dự đoán
- Có thể tái tạo
điều đó thôi cũng có thể dẫn đến sự cố bảo mật nghiêm trọng.
Đó là lý do Java cung cấp
các bộ tạo ngẫu nhiên tập trung vào bảo mật
riêng biệt với các bộ tạo giả ngẫu nhiên thông thường.
Nếu bạn triển khai mà không hiểu sự khác biệt này, bạn có thể dễ dàng kết thúc với:
- Mã “hoạt động” nhưng nguy hiểm
- Mã trở thành vấn đề trong đánh giá hoặc kiểm toán
Vì vậy hãy đảm bảo bạn hiểu điểm này.
2.5 “Phân Phối Đồng Nhất” Là Gì? (Cơ Bản Về Độ Lệch)
Một thuật ngữ thường xuất hiện trong các cuộc thảo luận về số ngẫu nhiên là phân phối đồng nhất.
Phân phối đồng nhất nghĩa là:
- Mọi giá trị xuất hiện với xác suất giống nhau
Ví dụ:
- Một con xúc xắc nơi 1–6 có khả năng bằng nhau
- Các chữ số 0–9 xuất hiện đều
Trạng thái đó là phân phối đồng nhất.
Các API ngẫu nhiên của Java thường được thiết kế giả định phân phối đồng nhất.
2.6 Các Ví Dụ Phổ Biến Ở Người Mới Về “Ngẫu Nhiên Có Độ Lệch”
Khi bạn thủ công “điều chỉnh” số ngẫu nhiên, bạn có thể vô tình giới thiệu độ lệch.
Các ví dụ phổ biến bao gồm:
- Ép buộc phạm vi sử dụng
%(toán tử dư) - Ép kiểu
doublesangintở điểm sai - Hiểu lầm liệu giới hạn có bao gồm hay không
Những cái này khó khăn vì mã vẫn chạy, điều này làm cho lỗi
khó nhận thấy.
Các phần sau sẽ giải thích, với các ví dụ cụ thể:
- Tại sao độ lệch xảy ra
- Cách viết đúng
vì vậy bạn có thể tránh những bẫy này.
3. Bắt Đầu Nhanh Với Math.random()
Từ đây, chúng ta sẽ xem xét các cách cụ thể để tạo số ngẫu nhiên trong Java.
Phương pháp đầu tiên là Math.random(), là đơn giản nhất và phổ biến nhất mà người mới gặp phải.
3.1 Math.random() Là Gì?
Math.random() là một phương thức tĩnh được cung cấp bởi Java trả về một giá trị ngẫu nhiên double lớn hơn hoặc bằng 0.0 và nhỏ hơn 1.0.
double value = Math.random();
Khi bạn chạy mã này, giá trị trả về là:
- lớn hơn hoặc bằng 0.0
- nhỏ hơn 1.0
Nói cách khác, 1.0 không bao giờ được bao gồm.
3.2 Tại Sao Math.random() Dễ Sử Dụng Đến Vậy
Lợi ích lớn nhất của Math.random() là
nó không yêu cầu thiết lập gì cả.
- Không tạo instance lớp
- Không có câu lệnh import
- Có thể sử dụng trong một dòng duy nhất
Vì điều này, nó rất tiện lợi cho:
- Các ví dụ học tập
- Các demo đơn giản
- Kiểm tra nhanh luồng chương trình
trong những tình huống như vậy.
3.3 Tạo Số Ngẫu Nhiên Nguyên Với Math.random()
Trong các chương trình thực tế, bạn thường muốn số ngẫu nhiên nguyên
thay vì giá trị double.
3.3.1 Tạo Số Ngẫu Nhiên Từ 0 Đến 9
int value = (int)(Math.random() * 10);
Các giá trị được tạo bởi mã này là:
- Lớn hơn hoặc bằng 0
- Nhỏ hơn hoặc bằng 9
Đây là lý do:
Math.random()trả về giá trị từ 0.0 đến 0.999…- Nhân với 10 cho 0.0 đến 9.999…
- Ép kiểu sang
intcắt bỏ phần thập phân
3.4 Một Lỗi Thường Gặp Khi Tạo 1 Đến 10
Một lỗi phổ biến ở người mới bắt đầu là nơi để dịch chuyển giá trị bắt đầu.
int value = (int)(Math.random() * 10) + 1;
Điều này tạo ra số ngẫu nhiên:
- lớn hơn hoặc bằng 1
- nhỏ hơn hoặc bằng 10
Nếu bạn nhầm thứ tự và viết như thế này:
// Common mistake
int value = (int)Math.random() * 10 + 1;
Mã này dẫn đến:
(int)Math.random()luôn là 0- Kết quả luôn trở thành 1
Luôn bọc ép kiểu trong ngoặc đơn—đây là điểm quan trọng.
3.5 Ưu Điểm Và Hạn Chế Của Math.random()
Ưu Điểm
- Cực kỳ đơn giản
- Chi phí học tập thấp
- Đủ cho các trường hợp sử dụng nhỏ, đơn giản
Hạn Chế
- Không thể tái tạo (không kiểm soát seed)
- Không kiểm soát nội bộ
- Không phù hợp cho các trường hợp sử dụng bảo mật
- Thiếu linh hoạt cho các tình huống phức tạp
Đặc biệt, nếu bạn cần:
- Các giá trị ngẫu nhiên giống nhau trong kiểm thử
- Kiểm soát chi tiết hành vi
thì Math.random() sẽ không đủ.
3.6 Khi Nào Bạn Nên Sử Dụng Math.random()
Math.random() phù hợp nhất cho:
- Giai đoạn học Java ban đầu
- Mã giải thích thuật toán
- Các mẫu xác minh đơn giản
Mặt khác, cho:
- Các ứng dụng kinh doanh
- Mã kiểm thử
- Logic liên quan đến bảo mật
bạn nên chọn một trình tạo số ngẫu nhiên phù hợp hơn.
4. Hiểu Về Lớp Cốt Lõi java.util.Random
Bây giờ hãy tiến xa hơn một bước so với Math.random() và xem xét
lớp java.util.Random.
Random là một lớp cơ bản đã được sử dụng nhiều năm trong Java. Nó xuất hiện khi bạn muốn
“kiểm soát đúng đắn các số ngẫu nhiên.”
4.1 Lớp Random Là Gì?
Random là một lớp để tạo số ngẫu nhiên giả.
Bạn sử dụng nó bằng cách tạo một instance như thế này:
import java.util.Random;
Random random = new Random();
int value = random.nextInt();
Sự khác biệt lớn nhất so với Math.random() là
trình tạo số ngẫu nhiên được coi như một đối tượng.
Điều này cho phép bạn:
- Tái sử dụng cùng một trình tạo
- Giữ hành vi nhất quán
- Quản lý rõ ràng tính ngẫu nhiên trong thiết kế
điều không thể với Math.random().
4.2 Các Loại Giá Trị Ngẫu Nhiên Bạn Có Thể Tạo Với Random
Lớp Random cung cấp các phương thức phù hợp với các trường hợp sử dụng khác nhau.
Các ví dụ phổ biến bao gồm:
nextInt(): một giá trị ngẫu nhiênintnextInt(bound): mộtinttừ 0 (bao gồm) đến bound (không bao gồm)nextLong(): một giá trị ngẫu nhiênlongnextDouble(): mộtdoubletừ 0.0 (bao gồm) đến 1.0 (không bao gồm)nextBoolean():truehoặcfalse
Bằng cách chọn phương thức đúng, bạn có thể tạo giá trị ngẫu nhiên
phù hợp tự nhiên với từng kiểu dữ liệu.
5. Kiểm Soát Phạm Vi Và Tính Tái Tạo Với Random
Một trong những ưu điểm lớn nhất của việc sử dụng java.util.Random là
kiểm soát rõ ràng phạm vi và tính tái tạo.
5.1 Tạo Giá Trị Trong Một Phạm Vi Cụ Thể
Phương thức được sử dụng phổ biến nhất là nextInt(bound).
Random random = new Random();
int value = random.nextInt(10);
Mã này tạo ra giá trị:
- lớn hơn hoặc bằng 0
- nhỏ hơn 10
Vậy phạm vi kết quả là 0 đến 9.
5.2 Dịch Chuyển Phạm Vi (ví dụ: 1 đến 10)
Để dịch chuyển phạm vi, chỉ cần cộng một độ dịch:
int value = random.nextInt(10) + 1;
Điều này tạo ra các giá trị từ:
- 1 (bao gồm)
- 10 (bao gồm)
Mẫu này:
random.nextInt(range) + start
là cách chuẩn để tạo các giá trị nguyên ngẫu nhiên trong một phạm vi trong Java.
5.3 Tạo Số Ngẫu Nhiên Với Phạm Vi Âm
Bạn cũng có thể tạo các phạm vi bao gồm giá trị âm.
Ví dụ, để tạo các giá trị từ -5 đến 5:
int value = random.nextInt(11) - 5;
Giải thích:
nextInt(11)→ 0 đến 10- Trừ 5 → -5 đến 5
Cách tiếp cận này hoạt động nhất quán bất kể dấu của phạm vi.
5.4 Tái Tạo Kết Quả Bằng Hạt Giống (Seed)
Một tính năng quan trọng khác của Random là kiểm soát hạt giống.
Nếu bạn chỉ định một hạt giống, chuỗi ngẫu nhiên sẽ trở nên có thể tái tạo:
Random random = new Random(12345);
int value1 = random.nextInt();
int value2 = random.nextInt();
Miễn là cùng một giá trị hạt giống được sử dụng:
- Cùng một chuỗi các giá trị ngẫu nhiên sẽ được tạo ra
Điều này cực kỳ hữu ích cho:
- Kiểm thử đơn vị
- So sánh mô phỏng
- Gỡ lỗi các lỗi khó
Ngược lại, Math.random() không cho phép kiểm soát hạt giống một cách rõ ràng.
6. Tại Sao Random Không Phù Hợp Cho Bảo Mật
Ở thời điểm này, bạn có thể nghĩ:
Random có thể tạo ra các giá trị không thể đoán trước, vậy sao không dùng nó cho bảo mật?
Đây là một hiểu lầm rất phổ biến.
6.1 Dự Đoán Là Vấn Đề Cốt Lõi
java.util.Random sử dụng một thuật toán quyết định.
Điều này có nghĩa là:
- Nếu thuật toán được biết
- Nếu quan sát đủ các giá trị đầu ra
thì các giá trị trong tương lai có thể được dự đoán.
Đối với trò chơi hoặc mô phỏng, điều này không phải là vấn đề.
Đối với bảo mật, đây là một lỗ hổng nghiêm trọng.
6.2 Các Ví Dụ Cụ Thể Về Việc Sử Dụng Nguy Hiểm
Sử dụng Random cho các mục đích sau là nguy hiểm:
- Tạo mật khẩu
- Khóa API
- Định danh phiên (session identifiers)
- Token xác thực
Ngay cả khi các giá trị “trông ngẫu nhiên”, chúng vẫn không bảo mật mật mã.
6.3 Sự Khác Biệt Chủ Yếu Giữa “Trông Ngẫu Nhiên” và “Bảo Mật”
Sự khác biệt quan trọng là:
- Random : nhanh, có thể tái tạo, lý thuyết có thể dự đoán
- Secure random : không thể đoán trước, chịu được phân tích
Ngẫu nhiên tập trung vào bảo mật phải được thiết kế với giả định rằng:
- Kẻ tấn công biết thuật toán
- Kẻ tấn công có thể quan sát các đầu ra
Random không đáp ứng yêu cầu này.
Đó là lý do Java cung cấp một lớp riêng biệt dành cho các trường hợp sử dụng bảo mật.
7. Sử Dụng SecureRandom Cho Ngẫu Nhiên Nhạy Cảm Bảo Mật
Khi ngẫu nhiên phải không thể đoán trước và chống lại các cuộc tấn công, Java cung cấp java.security.SecureRandom.
Lớp này được thiết kế đặc biệt cho các trường hợp sử dụng nhạy cảm về bảo mật.
7.1 Điều Gì Khiến SecureRandom Khác Biệt?
SecureRandom khác với Random ở mục tiêu thiết kế:
- Sử dụng các thuật toán mạnh về mật mã
- Lấy entropy từ nhiều nguồn hệ thống
- Được thiết kế để không thể đoán trước ngay cả khi các đầu ra được quan sát
Không giống như Random, trạng thái nội bộ của SecureRandom không thể đảo ngược thực tế.
7.2 Cách Dùng Cơ Bản Của SecureRandom
Cách dùng tương tự Random, nhưng mục đích hoàn toàn khác.
import java.security.SecureRandom;
SecureRandom secureRandom = new SecureRandom();
int value = secureRandom.nextInt(10);
Điều này tạo ra các giá trị từ:
- 0 (bao gồm)
- 10 (không bao gồm)
API được thiết kế cố ý giống nhau để có thể thay thế Random khi cần.
7.3 Khi Nào Bạn Phải Dùng SecureRandom
Bạn nên dùng SecureRandom cho:
- Tạo mật khẩu
- ID phiên (session IDs)
- Token xác thực
- Khóa mật mã
Trong những trường hợp này, việc dùng Random không chỉ “có chút rủi ro” — nó sai lầm.
Chi phí hiệu năng của SecureRandom là cố ý và chấp nhận được cho mục đích bảo mật.
8. Các API Ngẫu Nhiên Hiện Đại: ThreadLocalRandom và RandomGenerator
Các phiên bản Java gần đây cung cấp các API ngẫu nhiên tiên tiến hơn để giải quyết các vấn đề về hiệu năng và thiết kế.
8.1 ThreadLocalRandom: Ngẫu nhiên cho Đa luồng
ThreadLocalRandom được tối ưu cho môi trường đa luồng.
Thay vì chia sẻ một thể hiện Random duy nhất, mỗi luồng sẽ sử dụng bộ sinh riêng của mình.
int value = java.util.concurrent.ThreadLocalRandom.current().nextInt(1, 11);
Điều này sinh ra các giá trị từ 1 (bao gồm) đến 11 (không bao gồm).
Các ưu điểm bao gồm:
- Không có tranh chấp giữa các luồng
- Hiệu năng tốt hơn khi đồng thời
- API dựa trên phạm vi rõ ràng
Đối với xử lý song song, thường nên dùng cách này thay vì Random.
8.2 RandomGenerator: Giao diện Thống nhất (Java 17+)
RandomGenerator là một giao diện được giới thiệu để thống nhất việc sinh số ngẫu nhiên.
Nó cho phép:
- Thay đổi thuật toán một cách dễ dàng
- Viết mã không phụ thuộc vào triển khai cụ thể
- Thiết kế bền vững hơn cho tương lai
import java.util.random.RandomGenerator; RandomGenerator generator = RandomGenerator.getDefault(); int value = generator.nextInt(10);
Cách tiếp cận này được khuyến nghị cho các dự án Java hiện đại.
9. Tổng kết: Lựa chọn API Ngẫu nhiên Phù hợp trong Java
Java cung cấp nhiều API sinh số ngẫu nhiên vì
“ngẫu nhiên” có các ý nghĩa khác nhau tùy theo ngữ cảnh.
9.1 Hướng dẫn Quyết định Nhanh
Math.random(): học tập, demo đơn giảnRandom: kiểm thử, mô phỏng, hành vi có thể tái tạoThreadLocalRandom: ứng dụng đa luồngRandomGenerator: thiết kế hiện đại, linh hoạtSecureRandom: mật khẩu, token, bảo mật
Chọn sai API có thể không gây lỗi ngay lập tức,
nhưng sẽ tạo ra các vấn đề nghiêm trọng sau này.
9.2 Nguyên tắc Chính cần Nhớ
Điều quan trọng nhất cần ghi nhớ là:
Ngẫu nhiên là một quyết định thiết kế, không chỉ là một lời gọi hàm.
Bằng cách hiểu mục đích của từng API, bạn có thể viết mã Java:
- Đúng đắn
- Dễ bảo trì
- An toàn
và phù hợp với các ứng dụng thực tế.

