1. วิธีการสร้างตัวเลขสุ่มในภาษา C: ฟังก์ชัน rand
1.1 ฟังก์ชัน rand คืออะไร?
ฟังก์ชัน rand()
เป็นฟังก์ชันที่ใช้สร้างตัวเลขสุ่มเทียม (pseudo-random) ในภาษา C ตัวเลขสุ่มเทียมหมายถึงลำดับของตัวเลขที่สร้างขึ้นตามอัลกอริทึมที่กำหนดไว้ล่วงหน้า แม้จะไม่ใช่ตัวเลขสุ่มแท้จริง แต่ก็เพียงพอสำหรับการใช้งานทั่วไป rand()
จะส่งคืนค่าจำนวนเต็มตั้งแต่ 0 ถึง 32767 (ขึ้นอยู่กับระบบที่ใช้งาน แต่โดยปกติจะเป็นค่านี้)
1.2 วิธีใช้งานพื้นฐานของฟังก์ชัน rand
ในการใช้ฟังก์ชัน rand()
จะต้อง include stdlib.h
ก่อน ตัวอย่างโค้ดด้านล่างนี้เป็นตัวอย่างการสร้างตัวเลขสุ่มด้วย rand()
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int randomNumber = rand();
printf("Generated random number: %d
", randomNumber);
return 0;
}
เมื่อรันโค้ดนี้จะได้ตัวเลขสุ่มในช่วง 0 ถึง 32767 อย่างไรก็ตาม ถ้าใช้แบบนี้ทุกครั้งจะได้ลำดับเดิมของตัวเลขสุ่มทุกครั้งที่รันโปรแกรม ซึ่งจะกล่าวถึงวิธีแก้ไขในส่วนถัดไป

2. วิธีปรับช่วงของตัวเลขสุ่ม
2.1 การใช้ mod เพื่อจำกัดช่วง
ในการสร้างตัวเลขสุ่ม มักต้องการให้ค่าที่ได้อยู่ในช่วงที่กำหนด เช่น ถ้าต้องการตัวเลขสุ่มตั้งแต่ 1 ถึง 100 สามารถใช้โอเปอเรเตอร์ mod (%
) กับผลลัพธ์ของ rand()
เพื่อปรับช่วงได้
int numberInRange = rand() % 100 + 1; // สร้างตัวเลขสุ่มตั้งแต่ 1 ถึง 100
ในตัวอย่างนี้ ใช้ผลลัพธ์ของ rand()
หารด้วย 100 แล้วบวก 1 จะได้ตัวเลขสุ่มในช่วง 1 ถึง 100 การใช้ mod แบบนี้จะช่วยให้กำหนดช่วงของตัวเลขสุ่มได้ง่าย
2.2 การสร้างตัวเลขสุ่มในช่วงที่กำหนดเอง
หากต้องการความยืดหยุ่นในการกำหนดช่วงของตัวเลขสุ่ม สามารถสร้างฟังก์ชันขึ้นมาเอง ตัวอย่างด้านล่างคือฟังก์ชันที่รับค่าต่ำสุดและค่าสูงสุด แล้วสร้างตัวเลขสุ่มในช่วงนั้น
int getRandomNumber(int min, int max) {
return rand() % (max - min + 1) + min;
}
สามารถใช้ฟังก์ชันนี้ เช่น getRandomNumber(1, 100)
เพื่อสร้างตัวเลขสุ่มในช่วงที่ต้องการได้
3. เปลี่ยนรูปแบบของตัวเลขสุ่มด้วยฟังก์ชัน srand
3.1 ฟังก์ชัน srand คืออะไร?
ถ้าใช้ rand()
โดยตรง ทุกครั้งที่รันโปรแกรมจะได้ลำดับของตัวเลขสุ่มเหมือนเดิมเสมอ นี่คือคุณสมบัติของตัวเลขสุ่มเทียม ซึ่งอาจเป็นประโยชน์สำหรับการดีบัก แต่ถ้าต้องการตัวเลขสุ่มที่แตกต่างกันในแต่ละครั้ง ต้องใช้ฟังก์ชัน srand()
ในการตั้งค่า seed (ค่าตั้งต้น) เพื่อเปลี่ยนรูปแบบของตัวเลขสุ่ม
3.2 วิธีใช้ฟังก์ชัน srand
ให้เรียกใช้ srand()
ก่อนใช้ rand()
โดยปกติมักใช้ srand((unsigned int)time(NULL))
เพื่อกำหนด seed ตามเวลาปัจจุบัน
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
srand((unsigned int)time(NULL)); // ตั้งค่า seed ด้วยเวลา
int randomNumber = rand();
printf("Generated random number: %d
", randomNumber);
return 0;
}
โค้ดนี้ เมื่อใช้ srand()
แล้วทุกครั้งที่รันโปรแกรมจะได้รูปแบบตัวเลขสุ่มที่แตกต่างกัน time(NULL)
จะคืนค่าเวลา ณ ขณะนั้น (วินาที) ทำให้ seed แตกต่างกันในแต่ละครั้ง

4. ตัวอย่างการใช้งานตัวเลขสุ่ม
4.1 การใช้ตัวเลขสุ่มในเกม
ตัวเลขสุ่มถูกใช้บ่อยในพัฒนาเกม เช่น ใช้สุ่มตำแหน่งของตัวละคร หรือสุ่มโอกาสที่ไอเท็มจะปรากฏ ตัวอย่างนี้เป็นโค้ดจำลองการทอยลูกเต๋า
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
srand((unsigned int)time(NULL)); // ตั้งค่า seed
int diceRoll = rand() % 6 + 1; // สุ่มตัวเลข 1 ถึง 6
printf("Dice roll: %d
", diceRoll);
return 0;
}
โปรแกรมนี้จะสุ่มเลข 1 ถึง 6 เหมือนการทอยลูกเต๋า ช่วยให้เพิ่มความคาดเดาไม่ได้ในเกม
4.2 การจำลองแบบมอนติคาร์โล (Monte Carlo)
ตัวเลขสุ่มยังนำมาใช้ในการจำลองสถานการณ์ เช่น มอนติคาร์โล ซึ่งใช้ในการประมาณค่าของปัญหาที่ยากต่อการคำนวณโดยตรง ตัวอย่างนี้แสดงการประมาณค่าของ π (พาย) โดยใช้จุดสุ่ม
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
int n_trials = 1000000;
int n_inside = 0;
double x, y, pi;
srand((unsigned int)time(NULL));
for (int i = 0; i < n_trials; i++) {
x = (double)rand() / RAND_MAX;
y = (double)rand() / RAND_MAX;
if (x * x + y * y <= 1) {
n_inside++;
}
}
pi = 4.0 * n_inside / n_trials;
printf("Approximated π: %f
", pi);
return 0;
}
โปรแกรมนี้ใช้จุดสุ่มในการประมาณค่าพาย โดยสร้างจุดแบบสุ่มในช่วง 0 ถึง 1 จากนั้นคำนวณพื้นที่วงกลมเพื่อประมาณค่าของ π

5. ข้อควรระวังเกี่ยวกับฟังก์ชัน rand และ srand
5.1 ทำความเข้าใจเกี่ยวกับตัวเลขสุ่มเทียม
ตัวเลขสุ่มที่สร้างโดย rand()
ในภาษา C เป็นตัวเลขสุ่มเทียม ไม่ใช่สุ่มแท้จริง จะคำนวณจากอัลกอริทึมภายใน หากใช้ seed เดิม จะได้ลำดับตัวเลขเหมือนเดิม ข้อดีคือเหมาะสำหรับการดีบัก แต่ถ้าต้องการสุ่มแท้จริงอาจไม่เพียงพอ
5.2 ข้อผิดพลาดที่พบบ่อย
ข้อผิดพลาดที่พบบ่อย เช่น ลืมใช้ srand()
ก่อน rand()
หรือเข้าใจขอบเขตของ rand()
ผิด ถ้าไม่ใช้ srand()
จะได้ลำดับเดิมทุกครั้ง และการใช้ rand() % n
อาจทำให้ค่าที่ได้ไม่เป็นไปตามที่ต้องการ หากไม่ได้คำนวณช่วงให้ถูกต้อง
สรุป
การสร้างตัวเลขสุ่มในภาษา C มีประโยชน์ในหลายด้าน เช่น เกมและการจำลอง ถ้าเข้าใจวิธีใช้ rand()
และ srand()
ก็จะสามารถเพิ่มความคาดเดาไม่ได้ให้โปรแกรมของคุณได้ ลองนำไปใช้กับโปรแกรมของคุณดูนะครับ