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