การสุ่มตัวเลขในภาษา Java

ในบทนี้ คุณจะได้เรียนรู้เกี่ยวกับการสุ่มตัวเลขในภาษา Java เราจะแนะนำให้คุณรู้จักกับ Built-in เมธอดของภาษาที่เราสามารถใช้สำหรับสุ่มตัวเลขในภาษา Java ได้ นี่เป็นเนื้อหาในบทนี้

  • การสุ่มตัวเลขด้วยคลาส Random
  • การสุ่มตัวเลขด้วยเมธอด Math.random()
  • การสุ่มตัวเลขจาก 1 - 100
  • การสุ่มตัวเลขจากช่วงที่กำหนด Min, Max
  • ตัวอย่างโปรแกรมสุ่มค่าในอาเรย์

การสุ่มตัวเลขด้วยคลาส Random

วิธีที่ง่ายที่สุดสำหรับการสุ่มตัวเลขในภาษา Java คือการใช้เมธอดจากคลาส Random ในการใช้งานคลาสนี้ เราสามารถใช้เมธอด nextInt() เพื่อสุ่มตัวเลขจำนวนเต็ม (Integer) และเมธอด nextDouble() เพื่อสุ่มตัวเลขทศนิยม (Double) ได้ และนี่เป็นตัวอย่างแรกสำหรับการสุ่มตัวเลขในภาษา Java

RandomNumber.java
package com.marcuscode.random;

import java.util.Random;

public class RandomNumber {

    public static void main(String[] args) {

        Random rand = new Random();

        int n1 = rand.nextInt(100);
        int n2 = rand.nextInt(100);

        System.out.println("Random two integer numbers");
        System.out.println(n1);
        System.out.println(n2);

        double d1 = rand.nextDouble();
        double d2 = rand.nextDouble();

        System.out.println("Random two double numbers");
        System.out.println(d1);
        System.out.println(d2);

    }

}

นี่เป็นผลลัพธ์การทำงานของโปรแกรม ผลลัพธ์ในการรันแต่ละครั้งจะแตกต่างกันออกไปเนื่องจากมันได้มาจากการสุ่ม

Random two integer numbers
71
96
Random two double numbers
0.5032592984801411
0.37825113379793407

ในตัวอย่าง เป็นโปรแกรมสำหรับสุ่มตัวเลขในภาษา Java ด้วยคลาส Random เราได้สุ่มตัวเลขจำนวนเต็มและทศนิยมอย่างละสองตัว และแสดงตัวเลขที่สุ่มได้ออกทางหน้าจอ

Random rand = new Random();

ในตอนแรกเราจะต้องสร้างออบเจ็คจากคลาส Random ก่อนเพื่อที่จะสามารถเรียกงานใช้เมธอดจากออบเจ็คนี้เพื่อสุ่มตัวเลขได้ และเมื่อออบเจ็คถูกสร้างแล้วเราสามารถใช้มันสุ่มตัวเลขได้สองแบบคือตัวเลขจำนวนเต็มและทศนิยม

int n1 = rand.nextInt(100);
int n2 = rand.nextInt(100);

เมธอด nextInt() ใช้สำหรับสุ่มตัวเลขจำนวนเต็ม โดยเมธอดรับอาร์กิวเมนต์เพื่อกำหนดค่าสูงสุดสำหรับการสุ่ม ในกรณีนี้ เราได้ส่งอาร์กิวเมนต์เป็น 100 ในการสุ่ม ดังนั้นตัวเลขที่สุ่มได้จากเมธอดจะมีค่าอยู่ระหว่าง 0 - 99

double d1 = rand.nextDouble();
double d2 = rand.nextDouble();

เมธอด nextDouble() ใช้สำหรับสุ่มตัวเลขจำนวนจริงหรือทศนิยม โดยค่าที่ส่งกลับนั้นจะอยู่ระหว่าง 0.0 แต่น้อยกว่า 1.0 นั่นหมายความว่าตัวเลขที่สุ่มได้มากสุดอาจเป็น 0.9999... คุณสามารถทำการขยายช่วงของการสุ่มด้วยการคูณ Scale เข้าไปได้ ยกตัวอย่างเช่น

double d1 = rand.nextDouble() * 20;
double d2 = rand.nextDouble() * 20;

เพื่อสุ่มตัวเลขจำนวนเต็มที่มีค่าอยู่ระหว่าง 0.0 - 20.0 (โดยไม่รวม 20.0) เราเพียงแค่คูณค่าที่สุ่มได้กับ 20 ซึ่งนี่จะทำให้เราได้ตัวเลขที่มีค่าอยู่ระหว่าง 0.0 - 19.9999...

การสุ่มตัวเลขด้วยเมธอด Math.random()

วิธีที่สองในการสุ่มตัวเลขในภาษา Java คือการใช้ static เมธอด Math.random() เมธอดนี้ทำงานเหมือนกับเมธอด nextDouble() จากคลาส Random ที่คุณได้เรียนรู้ไปแล้วในตัวอย่างก่อนหน้า มันส่งค่ากลับเป็นตัวเลขทศนิยมที่มีค่าระหว่าง 0.0 - 1.0 ที่ไม่รวม 1.0 เช่นเดียวกัน นี่เป็นตัวอย่างการใช้งาน

RandomNumber2.java
package com.marcuscode.random;

public class RandomNumber2 {

    public static void main(String[] args) {

        double n1 = Math.random();
        double n2 = Math.random();

        System.out.println("Random numbers between 0.0 - 1.0");
        System.out.println(n1);
        System.out.println(n2);

        double n3 = Math.random() * 50;
        double n4 = Math.random() * 50;

        System.out.println("Random numbers between 0.0 - 50.0");
        System.out.println(n3);
        System.out.println(n4);
    }

}

นี่เป็นผลลัพธ์การทำงานของโปรแกรม ในการรันแต่ละครั้งผลลัพธ์การทำงานจะแตกต่างกันออกไปเนื่องจากค่าที่ได้เป็นการสุ่ม

Random numbers between 0.0 - 1.0
0.2012226581649611
0.344456769858536
Random numbers between 0.0 - 50.0
35.811806174597585
34.12983441366752

ในตัวอย่างนี้ เป็นการใช้เมธอด Math.random() สำหรับการสุ่มตัวเลขในภาษา Java เนื่องจากเมธอดนี้เป็น static เมธอด นั่นทำให้เราสามารถเรียกใช้งานมันจากชื่อคลาสได้โดยตรง โดยที่ไม่ต้องสร้างออบเจ็คขึ้นมาก่อนเหมือนกับในตัวอย่างก่อนหน้า

double n1 = Math.random();
double n2 = Math.random();

ในสองคำสั่งนี้เป็นการเรียกใช้เมธอดเพื่อสุ่มตัวเลขสองตัวเก็บไว้ในตัวแปร ค่าที่สุ่มได้จากเมธอดนี้เป็นตัวเลขทศนิยมที่มีค่าอยู่ระหว่าง 0.0 - 0.9999... อย่างที่เราได้บอกไปในตอนต้น

double n3 = Math.random() * 50;
double n4 = Math.random() * 50;

และเช่นเดิมเราสามารถขยายช่วงการสุ่มของตัวเลขได้โดยการคูณค่าสูงสุดที่ต้องการให้สุ่มได้เข้าไป ในกรณีนี้ ในการคูณ 50 เข้าไปยังผลลัพธ์ของการสุ่ม จะทำให้เราได้ตัวเลขที่มีค่าอยู่ระหว่าง 0.0 - 49.9999...

การสุ่มตัวเลขจาก 1 - 100

โดยปกติแล้วตัวเลขที่ได้จากการสุ่มจากเมธอดทั้งหมดนั้นจะเริ่มต้นจาก 0 ซึ่งนี่เป็นการทำงานพื้นฐานของเมธอด แต่ในการเขียนโปรแกรมจริงนั้น คุณอาจต้องการสุ่มตัวเลขจากช่วงอื่นๆ ยกตัวอย่างเช่น 1 - 10, 1 - 100 หรือ 50 - 100 เป็นต้น ในตัวอย่างนี้ เราจะมาประยุกต์ใช้เมธอดจากตัวอย่างก่อนหน้าเพื่อสุ่มตัวเลขที่มีค่าระหว่าง 1 - 100 นี่เป็นโค้ดของโปรแกรม

RamdomNumber3.java
package com.marcuscode.random;

import java.util.Random;

public class RamdomNumber3 {

    public static void main(String[] args) {

        Random rand = new Random();

        System.out.println("Random numbers between 1 - 100:");
        for (int i = 0; i < 10; i++) {
            int r =  rand.nextInt(100) + 1;
            System.out.print(r + ", ");
        }
    }

}

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

Random numbers between 1 - 100:
21, 36, 85, 62, 68, 100, 59, 30, 36, 72, 

ในตัวอย่างนี้ เป็นโปรแกรมสำหรับสุ่มตัวเลขระหว่าง 1 - 100 โดยการใช้เมธอด nextInt() เป็นจำนวนทั้งหมด 10 ตัวเลขและแสดงผลออกทางหน้าจอ และเช่นเดิมในตอนแรกเราสร้างออบเจ็ค rand ซึ่งเป็นออบเจ็คที่จะใช้สำหรับสุ่มตัวเลข

int r =  rand.nextInt(100) + 1;

ในคำสั่งนี้เป็นการสุ่มตัวเลขที่มีค่าระหว่าง 1 - 100 เก็บไว้ในตัวแปร r เนื่องจากการทำงานของคำสั่ง rand.nextInt(100) จะสุ่มตัวเลขได้ระหว่าง 0 - 99 ดังนั้นในการบวกค่าที่สุ่มได้ด้วย 1 จะทำให้เราได้ตัวเลขของการสุ่มเป็น 1 - 100 แทน นี่เป็นวิธีพื้นฐานในการสุ่มตัวเลขจากช่วงที่กำหนด

นอกจากการใช้เมธอด nextInt() แล้ว เรายังสามารถทำแบบเดียวกันได้ด้วยเมธอด nextDouble() หรือเมธอด Math.random() นี่เป็นตัวอย่าง

RamdomNumber4.java
package com.marcuscode.random;

public class RandomNumber4 {

    public static void main(String[] args) {
        System.out.println("Random numbers between 1 - 100:");

        for (int i = 0; i < 10; i++) {
            int r =  (int)(Math.random() * 100) + 1;
            System.out.print(r + ", ");
        }
    }

}

ผลลัพธ์การทำงานของตัวอย่างนี้เหมือนกับการใช้เมธอด nextInt() ในตัวอย่างก่อนหน้า แต่ในการเขียนนั้นแตกต่างกัน

int r =  (int)(Math.random() * 100) + 1;

เนื่องจากค่าที่ส่งกลับของเมธอด Math.random() มีค่าอยู่ระหว่าง 0.0 - 0.9999... ดังนั้นการคูณด้วย 100 และแปลงตัวเลขให้เป็นจำนวนเต็มจะทำให้ได้ค่าอยู่ระหว่าง 0 - 99 และทำการบวกค่าด้วย 1 เช่นเดิม สุดท้ายจะได้ผลลัพธ์ของการสุ่มที่มีค่าระหว่าง 1 - 100 ตามที่เราต้องการ

แม้ในตัวอย่างนี้จะแสดงการใช้งานเมธอดทั้งสองสำหรับสุ่มตัวเลขจาก 1 - 100 แต่นี่เป็นตัวอย่างการใช้งานอย่างง่ายเท่านั้น อย่างไรก็ตาม ถ้าหากตัวเลขที่ต้องการสุ่มนั้นเป็นจำนวนเต็ม การใช้เมธอด nextInt() จะสะดวกกว่า และในทางกลับกัน หากคุณต้องการสุ่มตัวเลขที่เป็นทศนิยม เช่น 0.0 - 50.0 การใช้เมธอด Math.random() จะเหมาะกว่า

การสุ่มตัวเลขจากช่วงที่กำหนด Min, Max

ในตัวอย่างก่อนหน้าเราได้เขียนโปรแกรมสำหรับสุ่มตัวเลขระหว่าง 1 - 100 แต่นั่นยังไม่ได้ยืดหยุ่นเพียงพอสำหรับการเขียนโปรแกรมจริง ในตัวอย่างนี้เราจะปรับปรุงโค้ดจากตัวอย่างก่อนหน้าเพื่อให้สามารถสุ่มตัวเลขจากช่วงที่กำหนดระหว่าง Min และ Max ได้ นี่เป็นตัวอย่าง

RandomNumber5.java
package com.marcuscode.random;

public class RandomNumber5 {

    public static int random(int min, int max) {
        return (int)(Math.random() * (max - min + 1)) + min;
    }

    public static void main(String[] args) {

        System.out.println("Random numbers between 1 - 10:");
        for (int i = 0; i < 10; i++) {
            int r =  random(1, 10);
            System.out.print(r + ", ");
        }

        System.out.println("\nRandom numbers between 10 - 20:");
        for (int i = 0; i < 10; i++) {
            int r =  random(10, 20);
            System.out.print(r + ", ");
        }

        System.out.println("\nRandom numbers between 1 - 100:");
        for (int i = 0; i < 10; i++) {
            int r =  random(1, 100);
            System.out.print(r + ", ");
        }
    }

}

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

Random numbers between 1 - 10:
6, 7, 5, 5, 8, 9, 5, 5, 10, 6, 
Random numbers between 10 - 20:
13, 13, 14, 16, 16, 12, 19, 18, 12, 17, 
Random numbers between 1 - 100:
89, 69, 68, 24, 12, 37, 52, 100, 97, 25, 

ในตัวอย่างนี้ เราได้ปรับปรุงโปรแกรมสุ่มตัวเลขจากตัวอย่างก่อนหน้าโดยการนำโค้ดสุ่มตัวเลขไปสร้างเป็นเมธอดเพื่อที่จะเรียกใช้งานซ้ำๆ ได้

public static int random(int min, int max) {
    return (int)(Math.random() * (max - min + 1)) + min;
}

เมธอด random() คือเมธอดสำหรับสุ่มตัวเลขที่เราสร้างขึ้นสำหรับสุ่มตัวเลขจากช่วงที่กำหนด มันรับพารามิเตอร์สองตัวคือ min และ max ความสามารถของเมธอดนี้ที่แตกต่างจากตัวอย่างก่อนหน้าคือมันสามารถสุ่มตัวเลขจากช่วงใดๆ ก็ได้ ไม่จำเป็นต้องเริ่มจาก 1 เสมอไป

System.out.println("Random numbers between 1 - 100:");
for (int i = 0; i < 10; i++) {
    int r =  random(1, 100);
    System.out.print(r + ", ");
}

จากนั้นเราสามารถเรียกใช้เมธอด random() สำหรับสุ่มตัวเลขโดยการส่งค่าต่ำสุดและสูงสุดที่ต้องการได้ ซึ่งโปรแกรมของเรานั้นยืดหยุดเพียงพอที่จะทำงานกับตัวเลขทุกช่วง ในตัวอย่าง เราได้สุ่มตัวเลขที่มีค่าระหว่าง 1 - 10, 10 - 20 และ 1 - 100 และผลลัพธ์การทำงานนั้นเป็นไปตามที่เราคาดหวัง

นอกจากนี้มันยังสามารถทำงานกับอาร์กิวเมนต์ที่เป็นลบได้ ยกตัวอย่างเช่น เราสามารถใช้มันสุ่มตัวเลขระหว่าง -50 ถึง 50 หรือ - 200 ถึง -100 ซึ่งสามารถเรียกใช้งานเมธอดได้ดังนี้

random(-50, 50);
random(-200, -100);

ตัวอย่างโปรแกรมสุ่มค่าในอาเรย์

หลังจากที่คุณได้เรียนรู้เมธอดพื้นฐานสำหรับใช้สุ่มตัวเลขในภาษา Java ไปแล้ว ในตัวอย่างสุดท้ายนี้ เราจะมาเขียนโปรแกรมสำหรับสุ่มค่าจากอาเรย์ โปรแกรมนี้จะมอบผลไม้ที่ได้จากการสุ่มให้กับคุณไว้ทานสำหรับวันนี้

ArrayRandom.java
package com.marcuscode.random;

import java.util.Random;

public class ArrayRandom {

    public static void main(String[] args) {
        String[] fruits = { 
            "Apple", "Banana", "Orange", "Grape", "Peach"
        };

        Random rand = new Random();
        int index = rand.nextInt(fruits.length);

        System.out.print("You've got: " + fruits[index]);
    }

}

นี่เป็นผลลัพธ์การทำงานของโปรแกรมจากการรันสองครั้ง เราได้รับผลไม้จากในอาเรย์แบบสุ่ม

You've got: Apple
You've got: Orange

เรามีตัวแปรอาเรย์ fruits ซึ่งเก็บชื่อของผลไม้เป็นจำนวน 5 รายชื่อ สิ่งที่เราต้องการทำคือการสุ่มเอาผลไม้หนึ่งอย่างจากในอาเรย์ และแสดงมันออกทางหน้าจอ และเช่นเคยเราสร้างออบเจ็ค rand ที่ใช้สำหรับสุ่มตัวเลข

int index = rand.nextInt(fruits.length);

ในคำสั่งนี้เป็นการสุ่มค่า Index ของอาเรย์เพื่อใช้ในการเข้าถึงค่าในอาเรย์ อาร์กิวเมนต์ที่ส่งเข้าไปยังเมธอดคือ fruits.length ซึ่งเป็นขนาดของอาเรย์ที่เป็น 5 ดังนั้นค่าที่เป็นไปได้จากการสุ่มจะอยู่ระหว่าง 0 - 4 ซึ่งเป็นช่วง Index ของอาเรย์

System.out.print("You've got: " + fruits[index]);

เราใช้ Index ที่ได้จากการสุ่มสำหรับเข้าถึงข้อมูลในอาเรย์ และแสดงชื่อของผลไม้ที่คุณได้รับออกทางหน้าจอ

ในบทนี้ คุณได้เรียนรู้การสุ่มตัวเลขในภาษา Java ด้วยเมธอด nextInt() และ nextDouble() ซึ่งเป็นเมธอดจากคลาส Random และ static เมธอด Math.random() เมธอดเหล่านี้เป็นเมธอดพื้นฐานที่เราสามารถใช้สุ่มตัวเลขในภาษา Java และการประยุกต์ใช้เมธอดสำหรับการสุ่มตัวเลขจากช่วงที่กำหนด