[Lập trình] 3 Cách Sinh Số Ngẫu Nhiên Với Java

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ớp java.lang.IllegalArgumentException.
  • Lớp java.lang.Math sử dụng phương thức nextDouble() của lớp java.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 longdoubleboolean, …

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

Bài viết liên quan

Leave a Reply

Your email address will not be published.