Random một số ngẫu nhiên trong Java

Ngày xưa mỗi lần các thầy cô có món quà gì đó với số lượng có hạn, thì các thầy cô sẽ chơi trò random ngẫu nhiên, cho mỗi sinh viên chọn 1 số may mắn, sau đó viết một ứng dụng đơn giản để random một số ngẫu nhiên trùng khớp với sinh viên nào thì phần quà sẽ về tay sinh viên đó. 

Một trò chơi khá là hay ho phải không nào, trong bài viết này chúng ta sẽ cùng nhau tìm hiểu cách để viết một ứng dụng tương tự như trên nhé.

Để random một số ngẫu nhiên trong Java, chúng ta có thể sử dụng các hàm random trong Math class và Random class mà Java đã hỗ trợ sẵn.

Random số ngẫu nhiên sử dụng Math class

Math class chứa một static Math.random() method dùng để random một số ngẫu nhiên có kiểu dữ liệu là double.

Hàm random() trả về một giá trị double có giá trị dương, lớn hơn hoặc bằng 0,0 và nhỏ hơn 1,0. Khi bạn gọi Math.random(), một java.util.Random sẽ được khởi tạo và sử dụng.

Bạn có thể sử dụng phương thức Math.random() có hoặc không truyền tham số. Nếu bạn cung cấp các tham số, phương pháp sẽ tạo ra các số ngẫu nhiên trong các tham số đã cho.

public static double randomNumber() {
     double x = Math.random();
     return x;
}

Phương thức randomNumber() sử dụng Math.random() để nhận lấy một giá trị ngẫu nhiên trong khoảng 0.0 đến 1.0

0.14090762586845385

Random số ngẫu nhiên trong một khoảng giá trị 

Để tạo các số ngẫu nhiên giữa một phạm vi nhất định, bạn cần chỉ định phạm vi đó. Một biểu thức tiêu chuẩn để đạt được điều này là:

(Math.random()) * ((max - min) + 1)) + min

Chúng ta cùng phân tích biểu thức trên:

  • Math.random() * ( max – min ) trả về giá trị trong khoảng [0, max – min), trong đó giá trị tối đa bị loại bỏ do giá trị lớn nhất mà Math.random trả về bé hơn 1.0. Cho ví dụ nếu bạn muốn random số trong khoảng [5, 10] theo công thức trên chúng ta có Math.random() * (10 – 5) thì kết quả sẽ trong khoảng [0, 5), không bao gồm 5.
  • Tiếp theo chúng ta cần dịch giá trị bên dưới từ 0 lên tối thiểu là min bằng cách cộng thêm một khoảng giá trị min vào.
    • Math.random() * ( max – min ) + min
  • Nhưng với biểu thức trên chúng ta vẫn chỉ được khoảng giá trị [0, max). Do vậy chúng ta cần thêm 1 vào tham số (max – min) thành (max – min + 1)
    • double x = (Math.random()*((max-min)+1))+min

Chúng ta có thể random một số int bằng cách convert double sang int.

Gỉa sử mình muốn khoảng giá trị từ 5 đến 10, mình muốn random ra số 10 thì chúng ta có biểu thức sau: 10 = (Math.randon) * (10 – 5 + 1) + 5 => Math.random() = 5/6. Từ đó chúng ta có thể suy ra rằng giá trị 10.0 <= max < 11.0. Khi chúng ta chuyển từ double sang int thì kết quả có thể đạt được [5 10] như mong muốn.

class GenerateRandom {
    public static void main( String args[] ) {
      int min = 50;
      int max = 100;
      //Generate random double value from 50 to 100 
      System.out.println("Random value in double from "+min+" to "+max+ ":");
      double random_double = Math.random() * (max - min + 1) + min; 
      System.out.println(random_double);
        
      //Generate random int value from 50 to 100 
      System.out.println("Random value in int from "+min+" to "+max+ ":");
      int random_int = (int)(Math.random() * (max - min + 1) + min);
      System.out.println(random_int);
    }
}

Random số ngẫu nhiên sử dụng Random class

Bạn có thể sử dụng lớp java.util.Random để tạo các số ngẫu nhiên thuộc các kiểu khác nhau, chẳng hạn như int, float, double, long và boolean. Để tạo số ngẫu nhiên, trước tiên, hãy tạo một Random object và sau đó gọi một trong các phương thức tạo giá trị ngẫu nhiên, chẳng hạn như nextInt (), nextDouble () hoặc nextLong ().

Gọi một trong các phương thức sau của Random object sẽ trả về giá trị:

  • nextInt(upperbound) sẽ trả về một số nguyên khoảng [0, upperbound – 1]
  • nextFloat() trả về 0.0 đến 1.0
  • nextDouble() trả về 0.0 đến 1.0
import java.util.Random;
class GenerateRandom {
    public static void main( String args[] ) {
      Random rand = new Random(); //instance of random class
      int upperbound = 25;
        //generate random values from 0-24
      int int_random = rand.nextInt(upperbound); 
      double double_random=rand.nextDouble();
      float float_random=rand.nextFloat();
      
      System.out.println("Random integer value from 0 to" + (upperbound-1) + " : "+ int_random);
      System.out.println("Random float value between 0.0 and 1.0 : "+float_random);
      System.out.println("Random double value between 0.0 and 1.0 : "+double_random);
    }
}

Random số ngẫu nhiên sử dụng ThreadLocalRandom

Để tạo số ngẫu nhiên bằng lớp ThreadLocalRandom, hãy làm theo các bước bên dưới:

  • Import the class ThreadLocalRandom class
  • Sử dụng các method:
    • ThreadLocalRandom.current().nextInt() để random số nguyên
    • ThreadLocalRandom.current().nextDouble() để random số kiểu double
    • ThreadLocalRandom.current().nextBoolean() để random số float
import java.util.concurrent.ThreadLocalRandom;
class GenerateRandom {
    public static void main( String args[] ) {
      // Generate random integers  
      int int_random = ThreadLocalRandom.current().nextInt();  
  
      // Print random integers 
      System.out.println("Random Integers: " + int_random); 

      // Generate Random doubles 
      double double_rand = ThreadLocalRandom.current().nextDouble(); 
  
      // Print random doubles 
      System.out.println("Random Doubles: " + double_rand); 
       
      // Generate random booleans 
      boolean boolean_rand = ThreadLocalRandom.current().nextBoolean(); 
       
      // Print random booleans 
      System.out.println("Random Booleans: " + boolean_rand); 
    }
}

Nguồn tham khảo

https://dzone.com/articles/random-number-generation-in-java

https://www.educative.io/edpresso/how-to-generate-random-numbers-in-java

4.5 2 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x