การสุ่มตัวเลขในภาษา Java
ในบทนี้ คุณจะได้เรียนรู้เกี่ยวกับการสุ่มตัวเลขในภาษา Java เราจะแนะนำให้คุณรู้จักกับ Built-in เมธอดของภาษาที่เราสามารถใช้สำหรับสุ่มตัวเลขในภาษา Java ได้ นี่เป็นเนื้อหาในบทนี้
- การสุ่มตัวเลขด้วยคลาส Random
- การสุ่มตัวเลขด้วยเมธอด Math.random()
- การสุ่มตัวเลขจาก 1 - 100
- การสุ่มตัวเลขจากช่วงที่กำหนด Min, Max
- ตัวอย่างโปรแกรมสุ่มค่าในอาเรย์
การสุ่มตัวเลขด้วยคลาส Random
วิธีที่ง่ายที่สุดสำหรับการสุ่มตัวเลขในภาษา Java คือการใช้เมธอดจากคลาส Random
ในการใช้งานคลาสนี้ เราสามารถใช้เมธอด nextInt()
เพื่อสุ่มตัวเลขจำนวนเต็ม (Integer) และเมธอด nextDouble()
เพื่อสุ่มตัวเลขทศนิยม (Double) ได้ และนี่เป็นตัวอย่างแรกสำหรับการสุ่มตัวเลขในภาษา 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
เช่นเดียวกัน นี่เป็นตัวอย่างการใช้งาน
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 นี่เป็นโค้ดของโปรแกรม
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()
นี่เป็นตัวอย่าง
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 ได้ นี่เป็นตัวอย่าง
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 ไปแล้ว ในตัวอย่างสุดท้ายนี้ เราจะมาเขียนโปรแกรมสำหรับสุ่มค่าจากอาเรย์ โปรแกรมนี้จะมอบผลไม้ที่ได้จากการสุ่มให้กับคุณไว้ทานสำหรับวันนี้
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 และการประยุกต์ใช้เมธอดสำหรับการสุ่มตัวเลขจากช่วงที่กำหนด