NỘI DUNG BÀI VIẾT
Số ngẫu nhiên là một số được chọn từ một nhóm giới hạn hoặc vô hạn các số mà không có một quy luật cụ thể để dự đoán được. Một chương trình sinh ra số ngẫu nhiên sẽ tạo ra các số khác nhau tại những thời điểm khác nhau trong quá trình thực thi. Mặc dù việc sinh số ngẫu nhiên trong lập trình đều dựa vào các thuật toán nên chúng không phải hoàn toàn là ngẫu nhiên nhưng thực tế chúng được ứng dụng trong nhiều mục đích khác nhau như thống kê, mã hóa, game,…
Trong bài viết này chúng ta sẽ cùng nhau tìm hiểu 3 cách tạo số ngẫu nhiên với Java.
1. Sử dụng lớp Math
Java cung cấp nhiều cách khác nhau để sinh số ngẫu nhiên trong một pham vi cho trước. Với cách này và 2 cách về sau chúng ta sẽ xét trong phạm vi từ 1-100.
Math hay java.lang.Math
là một lớp trong Java cung cấp các thao tác cơ bản với số như mũ, căn bậc, giá trị tuyệt đối, làm tròn,… Trong đó có phương thức random()
cho phép chúng ta tạo ra một số thập phân có giá trị lớn hơn hoặc bằng 0.0 và bé hơn 1.0(0.99999), giá trị của số thập phân này là ngẫu nhiên mỗi khi chạy phương thức.
Ở đây chúng ta xét trong phạm vi số nguyên từ 1 đến 100 nên để thay đổi từ phạm vi [0,1) thành [1,100] thì giá trị thập phân trả về bên trên cần nhân với 100 và cộng thêm 1 rồi ép kiểu(cast) về kiểu int như sau:
public class Random {
public static void main(String[] args) {
usingMathClass();
}
static void usingMathClass() {
//Vòng lặp in ra 5 số ngẫu nhiên
for (int i=0; i<5; i++) {
double randomDouble = Math.random();
randomDouble = randomDouble * 100 + 1;
int randomInt = (int) randomDouble;
System.out.println("Random number is : " + randomInt);
}
}
}
Code language: JavaScript (javascript)
Output:
Random number is : 96
Random number is : 17
Random number is : 75
Random number is : 11
Random number is : 18
2. Sử dụng lớp Random
Java.util.Random cung cấp phương thức nextInt()
với tham số truyền vào là một số nguyên không âm dùng để sinh số ngẫu nhiên trong phạm vi từ 0 đến một giá trị cho trước. Giá trị của số ngẫu nhiên lớn hơn hoặc bằng 0 và nhỏ hơn tham số truyền vào. Thực chất, thuật toán của lớp này chính là sử dụng công thức đồng dư tuyến tính(linear congruential generator).
Để có được phạm vi [1,100] thì tham số truyền vào là 100 và giá trị trả về của phương thức cộng thêm 1:
import java.util.Random;
public class Random {
public static void main(String[] args) {
usingRandomClass();
}
static void usingRandomClass() {
//Vòng lặp in ra 5 số ngẫu nhiên
for (int i=0; i<5; i++) {
Random rand = new Random();
int ranNum = rand.nextInt(100)+1;
System.out.println("Random number is " + ranNum);
}
}
}
Code language: JavaScript (javascript)
Output:
Random number is 31
Random number is 14
Random number is 59
Random number is 18
Random number is 52
3. Sử dụng lớp ThreadLocalRandom
Kể từ Java 7 ta được cung cấp một lớp mới java.util.concurrent.ThreadLocalRandom
cho phép sinh số ngẫu nhiên trong môi trường đa luồng và ít tốn kém hơn so với việc sử dụng lớp java.util.Random.
Lớp ThreadLocalRandom
cung cấp phương thức nextInt()
với hai tham số truyền vào là giá trị biên dưới và giá trị biên trên, giá trị trả về sẽ lớn hơn hoặc bằng biên dưới và bé hơn giá trị biên trên.
Do dó để có phạm vi sinh số ngẫu nhiên [1, 100] thì hai tham số truyền vào sẽ là 1 và 101. Để thực thi phương thức nextInt()
nà trước hết ta cần gọi đến phương thức current()
để trả về ThreadLocalRandom của luồng hiện tại.
import java.util.concurrent.ThreadLocalRandom;
public class Random {
public static void main(String[] args) {
usingThreadLocalClass();
}
static void usingThreadLocalClass() {
//Vòng lặp in ra 5 số ngẫu nhiên
for (int i=0; i<5; i++) {
int ranNum = ThreadLocalRandom.current().nextInt(1,101);
System.out.println("Random number is "+ranNum);
}
}
}
Code language: JavaScript (javascript)
Output:
Random number is 17
Random number is 100
Random number is 47
Random number is 49
Random number is 40
Một số chú ý:
- Giá trị truyền vào của phương thức
nextInt()
nên là số dương, nếu nhỏ hơn 0 chương trình sẽ trả về exception thuộc lớpjava.lang.IllegalArgumentException
. - Lớp
java.lang.Math
sử dụng phương thứcnextDouble()
của lớpjava.util.Random
để dùng cho phương thức random() của nó. java.util.concurrent.ThreadLocalRandom
là một lớp con của lớp java.util.Random.java.util.Random
còn cung cấp các phương thức để sinh số ngẫu nhiên kiểu long, double, boolean, …
Kết
Như vậy mình và các đã cùng nhau tìm hiểu 3 cách sinh số ngẫu nhiên khác nhau. Nếu bài viết có ý nghĩa hãy để lại đánh giá cũng như comment giúp phát triển bài viết tốt hơn. Cảm ơn bạn đọc!
Tham khảo khóa học lập trình web 6 tháng, đảm bảo 100% công việc đầu ra!
Nguồn: https://codelearn.io/sharing/3-cach-sinh-so-ngau-nhien-voi-java