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

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

วิธีการ:

ใน Go, ตัวเลขสุ่มถูกสร้างโดยใช้แพ็กเกจ math/rand สำหรับตัวเลขสุ่มปลอมหรือ crypto/rand สำหรับตัวเลขสุ่มปลอมที่ปลอดภัยทางเข้ารหัสลับ เรามาสำรวจทั้งสองกัน

การใช้ math/rand สำหรับตัวเลขสุ่มปลอม

เริ่มแรก นำเข้าแพ็กเกจ math/rand และแพ็กเกจ time เพื่อปลูกฝังตัวสร้างตัวเลข การปลูกฝังทำให้คุณได้ลำดับของตัวเลขที่แตกต่างกันในแต่ละครั้งที่รัน

package main

import (
	"fmt"
	"math/rand"
	"time"
)

func main() {
	rand.Seed(time.Now().UnixNano())
	fmt.Println("A random number:", rand.Intn(100)) // สร้างตัวเลขระหว่าง 0 และ 99
}

ตัวอย่างผลลัพธ์: A random number: 42

การใช้ crypto/rand สำหรับตัวเลขสุ่มปลอมที่ปลอดภัยทางเข้ารหัสลับ

สำหรับการประยุกต์ใช้งานที่มีความสำคัญด้านความปลอดภัยมากขึ้น, แพ็กเกจ crypto/rand เป็นทางเลือกที่เหมาะสมเนื่องจากมันสร้างตัวเลขสุ่มที่ยากต่อการคาดเดา ทำให้เหมาะสำหรับการดำเนินการทางคริปโตกราฟฟิค

package main

import (
	"crypto/rand"
	"fmt"
	"math/big"
)

func main() {
	n, _ := rand.Int(rand.Reader, big.NewInt(100))
	fmt.Println("A secure random number:", n)
}

ตัวอย่างผลลัพธ์: A secure random number: 81

ศึกษาเพิ่มเติม

ความแตกต่างหลักระหว่างแพ็กเกจ math/rand และ crypto/rand ใน Go มาจากแหล่งกำเนิดของเอนโทรปีและการใช้งานที่ตั้งใจไว้ math/rand สร้างตัวเลขสุ่มปลอมตามเมล็ดเริ่มต้น; ดังนั้นลำดับจึงเป็นแบบจำเพาะและสามารถคาดเดาได้หากทราบเมล็ดนั้น นี่เหมาะสำหรับสถานการณ์ที่ประสิทธิภาพสูงและไม่ใช่ความไม่สามารถคาดเดาเป็นประเด็นหลัก เช่น การจำลองสถานการณ์หรือเกม

ในทางกลับกัน, crypto/rand ได้รับความไม่สุ่มจากระบบปฏิบัติการที่อยู่ภายใต้ ทำให้เหมาะสำหรับการใช้งานด้านคริปโตกราฟฟิคที่ความไม่สามารถคาดเดาเป็นสิ่งสำคัญ อย่างไรก็ตาม นี่มาพร้อมกับค่าใช้จ่ายด้านประสิทธิภาพและความซับซ้อนในการจัดการกับตัวเลขที่มันสร้าง (เช่น การจัดการกับประเภท *big.Int สำหรับจำนวนเต็ม)

ในอดีต แนวคิดของการสร้างตัวเลขสุ่มในคอมพิวเตอร์มักจะเคลื่อนไหวตามขอบเขตของ “ความสุ่ม” ที่แท้จริง โดยระบบแรกๆ พึ่งพาอัลกอริทึมที่คงที่ซึ่งพยายามจำลองความสุ่ม ตามที่คอมพิวเตอร์พัฒนาขึ้น อัลกอริทึมเหล่านี้ก็ได้รับการปรับปรุงให้มีแหล่งกำเนิดเอนโทรปีที่ซับซ้อนมากขึ้นจากสภาพแวดล้อมของมัน

แม้จะมีการปรับปรุงเหล่านี้ การมองหาความสมบูรณ์แบบของความสุ่มในการคำนวณเป็นเรื่องที่ขัดแย้งในตัวเอง เนื่องจากธรรมชาติที่คงที่ของคอมพิวเตอร์เอง นี่คือเหตุผลที่ สำหรับส่วนใหญ่ของการประยุกต์ใช้งานที่ความสามารถในการคาดเดาอาจเป็นอันตราย ตัวเลขสุ่มปลอมที่ปลอดภัยทางเข้ารหัสลับจากแหล่งที่มาเช่น crypto/rand เป็นทางเลือกที่ดีกว่า แม้ว่าจะมีภาระเพิ่มเติมก็ตาม

โดยสรุป, วิธีการของ Go กับสองแพ็กเกจที่แตกต่างกันสำหรับการสร้างตัวเลขสุ่มจัดการกับการลดทอนระหว่างประสิทธิภาพและความปลอดภัยได้อย่างสง่างาม เพื่อให้นักพัฒนาสามารถเลือกตามความต้องการเฉพาะของพวกเขา