วิธีสร้างตัวเลขสุ่มในภาษา C ด้วยฟังก์ชัน rand และ srand พร้อมตัวอย่างโค้ด

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() ก็จะสามารถเพิ่มความคาดเดาไม่ได้ให้โปรแกรมของคุณได้ ลองนำไปใช้กับโปรแกรมของคุณดูนะครับ