1. บทนำ
ในการเขียนโปรแกรม ตัวเลขสุ่มถูกนำมาใช้ในหลายวัตถุประสงค์ และในภาษา C ก็มีการใช้งานอย่างกว้างขวางเช่นกัน ตัวเลขสุ่มเป็นแนวคิดสำคัญที่ถูกใช้ในสถานการณ์ต่าง ๆ เช่น การสร้างเนื้อเรื่องเกม การสุ่มตัวอย่างข้อมูล หรือการสับข้อมูลแบบสุ่ม บทความนี้จะอธิบายอย่างละเอียดเกี่ยวกับวิธีการสร้างตัวเลขสุ่มในภาษา C พร้อมยกตัวอย่างการใช้งานจริง เพื่อให้คุณเข้าใจและสามารถประยุกต์ใช้การสร้างตัวเลขสุ่มในภาษา C ได้หลากหลายมากขึ้น
2. ตัวเลขสุ่มคืออะไร
ความหมายของตัวเลขสุ่มและตัวเลขสุ่มเทียม
ตัวเลขสุ่มคือค่าตัวเลขที่ไม่สามารถคาดเดาได้ ซึ่งโดยทั่วไปจะถูกสร้างขึ้นแบบสุ่มภายในช่วงที่กำหนด อย่างไรก็ตาม ตัวเลขสุ่มที่สร้างโดยคอมพิวเตอร์จริง ๆ แล้วเป็นสิ่งที่เรียกว่า “ตัวเลขสุ่มเทียม” ซึ่งสร้างขึ้นตามกฎของอัลกอริทึม ทำให้ไม่สุ่มอย่างแท้จริง เนื่องจากตัวเลขสุ่มเทียมถูกสร้างจากอัลกอริทึม หากใช้ค่า seed (ค่าตั้งต้น) เดิม ก็จะได้ลำดับตัวเลขสุ่มชุดเดิมทุกครั้ง
3. วิธีการสร้างตัวเลขสุ่มในภาษา C
ภาษา C มีฟังก์ชันมาตรฐานสำหรับสร้างตัวเลขสุ่ม บทนี้จะอธิบายฟังก์ชันที่ใช้บ่อย ได้แก่ rand()
, ค่าคงที่ RAND_MAX
และฟังก์ชัน srand()
สำหรับตั้งค่า seed
พื้นฐานของฟังก์ชัน rand()
rand()
เป็นฟังก์ชันพื้นฐานในภาษา C สำหรับสร้างตัวเลขสุ่ม ฟังก์ชันนี้จะคืนค่าจำนวนเต็มตั้งแต่ 0 ถึง RAND_MAX
ซึ่งเป็นค่าคงที่ที่ถูกกำหนดไว้ในไลบรารี โดยค่าของ RAND_MAX
จะแตกต่างกันไปตามระบบ แต่โดยทั่วไปจะมีค่า 32767
#include <stdio.h>
#include <stdlib.h>
int main() {
int random_number = rand();
printf("Random number: %d\n", random_number);
return 0;
}
โค้ดด้านบนใช้ rand()
เพื่อสร้างจำนวนเต็มแบบสุ่มตั้งแต่ 0 ถึง 32767 และแสดงผลออกมา
การตั้งค่า seed ด้วยฟังก์ชัน srand()
เนื่องจาก rand()
จะสร้างตัวเลขสุ่มตามค่า seed หากไม่ตั้งค่า seed จะได้ลำดับตัวเลขสุ่มเดิมทุกครั้ง เพื่อหลีกเลี่ยงปัญหานี้ เราสามารถใช้ srand()
เพื่อตั้งค่า seed วิธีที่นิยมคือใช้เวลาปัจจุบันเป็นค่า seed
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand((unsigned int) time(NULL)); // ตั้งค่า seed ด้วยเวลาปัจจุบัน
int random_number = rand();
printf("Random number: %d\n", random_number);
return 0;
}
ตัวอย่างนี้ใช้ time(NULL)
เพื่อดึงเวลาปัจจุบันมาเป็นค่า seed ทำให้ได้ผลลัพธ์ตัวเลขสุ่มที่แตกต่างกันในแต่ละครั้งที่รันโปรแกรม
การสร้างตัวเลขสุ่มในช่วงที่กำหนด
ถ้าต้องการตัวเลขสุ่มในช่วงที่กำหนด เช่น 1 ถึง 10 สามารถทำได้ดังนี้
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand((unsigned int) time(NULL));
int min = 1;
int max = 10;
int random_number = min + rand() % (max - min + 1);
printf("Random number between %d and %d: %d\n", min, max, random_number);
return 0;
}
โค้ดนี้จะสร้างตัวเลขสุ่มระหว่าง 1 ถึง 10 โดยใช้ rand() % (max - min + 1)
เพื่อให้ได้ค่าภายในช่วงที่กำหนด

4. ตัวอย่างการประยุกต์ใช้ตัวเลขสุ่ม
ตัวอย่างการนำตัวเลขสุ่มไปใช้จริงมีดังนี้
การจำลองการทอยลูกเต๋า
สามารถสร้างตัวเลขสุ่มระหว่าง 1 ถึง 6 เพื่อจำลองการทอยลูกเต๋าได้
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand((unsigned int) time(NULL));
int dice_roll = 1 + rand() % 6;
printf("Dice roll: %d\n", dice_roll);
return 0;
}
โค้ดนี้จะแสดงผลเป็นค่าระหว่าง 1 ถึง 6 เหมือนการทอยลูกเต๋า
การสับลำดับของอาร์เรย์
สามารถสับลำดับข้อมูลในอาร์เรย์แบบสุ่มได้ โดยการสลับตำแหน่งของสมาชิกแบบสุ่ม
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void shuffle(int *array, int size) {
for (int i = 0; i < size; i++) {
int j = rand() % size;
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
int main() {
srand((unsigned int) time(NULL));
int array[] = {1, 2, 3, 4, 5, 6};
int size = sizeof(array) / sizeof(array[0]);
shuffle(array, size);
printf("Shuffled array: ");
for (int i = 0; i < size; i++) {
printf("%d ", array[i]);
}
printf("\n");
return 0;
}
โค้ดนี้จะสุ่มลำดับของสมาชิกในอาร์เรย์
การใช้งานในเกม
ในเกม ตัวเลขสุ่มสามารถใช้กำหนดตำแหน่งศัตรู การดรอปไอเท็ม หรือเหตุการณ์ต่าง ๆ เพื่อเพิ่มความหลากหลายและความคาดเดาไม่ได้
5. ข้อควรระวังในการสร้างตัวเลขสุ่ม
ข้อจำกัดของฟังก์ชัน rand()
rand()
แม้จะเพียงพอสำหรับงานพื้นฐาน แต่เป็นตัวเลขสุ่มเทียมซึ่งมีคาบซ้ำ หากต้องสร้างตัวเลขจำนวนมาก อาจเกิดรูปแบบที่ซ้ำกันและไม่เหมาะกับงานที่ต้องการความสุ่มสมบูรณ์
ปัญหาในสภาพแวดล้อมมัลติเธรด
ในมัลติเธรด ถ้าใช้ rand()
ร่วมกัน อาจทำให้หลายเธรดใช้ค่า seed เดียวกันและได้ค่าซ้ำ ควรกำหนดค่า seed แยกต่อเธรด
การใช้ตัวสร้างตัวเลขสุ่มคุณภาพสูง
ภาษาอื่นหรือ C++ มีตัวสร้างตัวเลขสุ่มคุณภาพสูงกว่า เช่น random()
หรือเมอร์เซนน์ทวิสเตอร์ (mt19937
) ซึ่งให้ผลลัพธ์ที่มีความสุ่มดีกว่า
6. สรุป
บทความนี้ได้อธิบายวิธีสร้างตัวเลขสุ่มในภาษา C พร้อมตัวอย่างการใช้งานและการประยุกต์ใช้ ฟังก์ชัน rand()
มีประโยชน์ในงานพื้นฐาน แต่หากต้องการความสุ่มสมบูรณ์ ควรเลือกใช้อัลกอริทึมที่มีคุณภาพสูงกว่า