การสร้างตัวเลขสุ่ม

C:
การสร้างตัวเลขสุ่ม

วิธีทำ:

ในภาษา C ตัวเลขสุ่มสามารถถูกสร้างขึ้นโดยใช้ฟังก์ชัน rand() ซึ่งเป็นส่วนหนึ่งของห้องสมุดมาตรฐาน C <stdlib.h> โดยค่าเริ่มต้น rand() จะผลิตตัวเลขปลอมสุ่มในช่วงตั้งแต่ 0 ไปถึง RAND_MAX (ค่าคงที่ที่กำหนดไว้ใน <stdlib.h>) สำหรับการควบคุมช่วงได้มากขึ้น โปรแกรมเมอร์สามารถจัดการกับผลลัพธ์ของ rand()

นี่คือตัวอย่างง่ายๆ ของการสร้างตัวเลขสุ่มระหว่าง 0 และ 99:

#include <stdio.h>
#include <stdlib.h> // สำหรับ rand() และ srand()
#include <time.h>   // สำหรับ time()

int main() {
    // ปลูกเมล็ดตัวเลขสุ่ม
    srand((unsigned) time(NULL));

    // สร้างตัวเลขสุ่มระหว่าง 0 และ 99
    int randomNumber = rand() % 100;

    printf("ตัวเลขสุ่ม: %d\n", randomNumber);

    return 0;
}

ผลลัพธ์ตัวอย่างอาจแตกต่างกันทุกครั้งที่คุณรันโปรแกรมนี้:

ตัวเลขสุ่ม: 42

เพื่อสร้างตัวเลขสุ่มในช่วงที่ต่างกัน คุณสามารถปรับตัวดำเนินการโมดูลัส (%) ได้ตามความเหมาะสม เช่น rand() % 10 สร้างตัวเลขตั้งแต่ 0 ถึง 9

สำคัญที่จะต้องทราบว่าการปลูกเมล็ดตัวเลขสุ่มปลอม (srand() call) ด้วยเวลาปัจจุบัน (time(NULL)) จะรับประกันว่ามีลำดับของตัวเลขสุ่มที่ต่างกันในแต่ละครั้งที่โปรแกรมถูกรัน หากไม่มีการปลูกเมล็ด (srand()) rand() จะผลิตลำดับตัวเลขเดียวกันทุกครั้งที่โปรแกรมรัน

ตรวจดูอย่างละเอียด

ฟังก์ชัน rand() และเคาน์เตอร์การปลูกเมล็ด srand() ได้เป็นส่วนหนึ่งของห้องสมุดมาตรฐาน C เป็นเวลาหลายทศวรรษ พวกมันอิงตามอัลกอริทึมที่สร้างลำดับของตัวเลขที่ดูเหมือนจะเป็นสุ่ม—จึงเรียกว่า “สุ่มปลอม” อัลกอริทึมภายใต้ rand() โดยทั่วไปคือเครื่องกำเนิดตัวเลขเชิงเส้นอสมการ (LCG)

ในขณะที่ rand() และ srand() เป็นเพียงพอสำหรับการใช้งานหลายอย่าง พวกมีข้อจำกัดที่รู้จักกันดีโดยเฉพาะเกี่ยวกับคุณภาพของความสุ่มและความสามารถในการทำนายได้ สำหรับการใช้งานที่ต้องการความสุ่มคุณภาพสูง เช่น การดำเนินการเชิงอักขระ ควรพิจารณาทางเลือกอื่น เช่น /dev/random หรือ /dev/urandom (บนระบบที่คล้าย Unix) หรือ API ที่มีให้โดยห้องสมุดเชิงอักขระ

ด้วยการแนะนำ C11 มาตรฐาน ISO C ได้รวมหัวข้อใหม่ <stdatomic.h> ซึ่งเสนอการควบคุมที่ละเอียดยิ่งขึ้นสำหรับการดำเนินการร่วมกัน แต่ไม่ได้เกี่ยวข้องโดยตรงกับความสุ่ม สำหรับความสุ่มจริงๆ ใน C นักพัฒนาบ่อยครั้งหันไปใช้ไลบรารีเฉพาะแพลตฟอร์มหรือภายนอกที่เสนออัลกอริทึมที่ดีกว่าหรือใช้แหล่งความไม่แน่นอนของฮาร์ดแวร์

จำไว้ว่าในขณะที่ rand() ทำหน้าที่เป็นวิธีที่ง่ายและเข้าถึงได้ในการสร้างตัวเลขสุ่มปลอม การใช้งานในโปรแกรมสมัยใหม่มีจำกัดโดยคุณภาพและความสามารถในการทำนายผลลัพธ์ หากต้องการโซลูชันที่แข็งแกร่งกว่านี้ โดยเฉพาะสำหรับการใช้งานที่ต้องระมัดระวังด้านการรักษาความปลอดภัย การสำรวจนอกขอบเขตของห้องสมุดมาตรฐานเป็นสิ่งที่แนะนำอย่างยิ่ง