ฉันแค่ไตร่ตรองเกี่ยวกับrand()
ฟังก์ชั่นPHP และคิดเกี่ยวกับวิธีที่ฉันสามารถสร้างมันขึ้นมาใหม่และฉันก็ประหลาดใจอย่างสมบูรณ์
เครื่องกำเนิดตัวเลขสุ่มทำงานอย่างไร
function rand() { return 4; /* determined by die roll - guaranteed to be random */ }
ฉันแค่ไตร่ตรองเกี่ยวกับrand()
ฟังก์ชั่นPHP และคิดเกี่ยวกับวิธีที่ฉันสามารถสร้างมันขึ้นมาใหม่และฉันก็ประหลาดใจอย่างสมบูรณ์
เครื่องกำเนิดตัวเลขสุ่มทำงานอย่างไร
function rand() { return 4; /* determined by die roll - guaranteed to be random */ }
คำตอบ:
Random Number Generators (RNGs) กำลังสร้างตัวเลขสุ่มเทียมเนื่องจากเป็นไปไม่ได้ที่จะสร้างตัวเลขสุ่มอย่างแท้จริง สิ่งที่สุ่มเท่านั้นจริงๆคือการกระทำของพระเจ้าเช่นฟ้าผ่า
บทความวิกิพีเดียนี้อาจช่วยคุณได้ในการอธิบาย: http://en.wikipedia.org/wiki/Random_number_generators
จากสิ่งที่ฉันเข้าใจมีสองส่วนโดยทั่วไปคือ RNG: เมล็ดแล้วจำนวนสุ่มที่เลือกจากเมล็ดนั้น เมื่อคุณเพาะเมล็ด RNG คุณจะให้มันเทียบเท่ากับจุดเริ่มต้น จุดเริ่มต้นนั้นจะมีจำนวนตัวเลขที่ "ภายใน" ของโปรแกรมที่เลือกจาก ใน PHP คุณสามารถใช้ srand () เพื่อ "สุ่ม" เมล็ดเพื่อให้คุณได้คำตอบที่ต่างออกไป จากนั้นคุณสามารถใช้แรนด์ (นาที, สูงสุด) เพื่อไปยังเมล็ดพืชและเลือกตัวเลขระหว่างนาทีและสูงสุดรวม
คำเตือน, บทวิเคราะห์ล่วงหน้าที่เป็นไปได้คือชีส!
คิดว่าแต่ละ 'เมล็ด' เป็นหน้าอกน้ำแข็งแล้วตัวเลขสุ่มเป็นก้อนน้ำแข็ง สมมติว่าคุณมีตู้น้ำแข็ง 1,000 ตู้และแต่ละตู้มีตู้น้ำแข็ง 1000 ก้อน ที่งานเคาน์ตีแฟร์พวกเขาจะเลือกตู้แช่น้ำแข็งเพื่อเริ่มใช้สำหรับเครื่องดื่มและพวกเขาสามารถใช้ก้อนน้ำแข็งได้เพียงก้อนเดียวเท่านั้น อย่างไรก็ตามพวกเขาต้องการเพียงก้อนน้ำแข็งที่มีขนาดใหญ่กว่า 1 ลูกบาศก์นิ้วเท่านั้น ดังนั้นพวกเขาจะเลือกหีบสุ่มระหว่าง 1,000 หีบนั้นจากนั้นพวกเขาจะเลือกก้อนน้ำแข็งที่อยู่ในหีบสุ่ม ถ้ามันใช้งานได้กับขนาดที่พวกเขาต้องการพวกมันก็ใช้มัน หากไม่เป็นเช่นนั้นพวกเขาจะนำมันกลับไปไว้ที่หน้าอกกับคนอื่น ๆ หากพวกเขาต้องการทำให้สนุกมากขึ้นพวกเขาเปลี่ยนทรวงอกล่วงหน้าเพื่อความหลงลืมโดยรวมหากคุณต้องการ!
สำหรับวิธีการที่ PHP เลือกเมล็ดและจำนวนสุ่มจริง ๆ แล้วฉันไม่มีความรู้เพียงพอสำหรับสิ่งนั้น (ซึ่งอาจเป็นสิ่งที่คุณสงสัยมากที่สุด!) ฉันจะไม่ลองและทำซ้ำฟังก์ชั่น rand (); สำหรับแอปพลิเคชันที่ทำงานบนเว็บส่วนใหญ่ที่คุณสร้างแรน () ควรจะพอเพียงสำหรับหมายเลขสุ่มใด ๆ ที่คุณต้องการ
ลองตรวจสอบกำเนิดที่เป็นเชิงเส้นซึ่งอาจเป็นสิ่งที่คุณกำลังมองหาหากคุณต้องการรายละเอียดที่สกปรก: http://en.wikipedia.org/wiki/Linear_congruential_generator
หวังว่านี่จะช่วยได้!
god
สุ่มอย่างน้อยจะเป็นอย่างไร? ยิ่งไปกว่านั้นฟ้าผ่าไม่ได้สุ่มอย่างใดอย่างหนึ่งตามเส้นทางที่กำหนดโดยเงื่อนไขต่าง ๆ นอกจากนี้ล่ามที่สร้างหมายเลขนั้นไม่เกี่ยวข้องโดยพื้นฐานแล้ว
พวกเขามักจะไม่สุ่มอย่างแท้จริง แต่จะเรียกว่าหลอกหลอกเพราะพวกเขาสร้างลำดับหมายเลขที่ปรากฏแบบสุ่ม นี่คือสูตรทางคณิตศาสตร์ที่น่าสนใจ หนึ่งที่พบมากที่สุดคือการเชิงเส้น congruential ปั่นไฟ
ตัวเลขสุ่มหลอกมีคุณสมบัติที่มีประโยชน์อย่างหนึ่งที่หมายเลขสุ่มจริงไม่ได้: ถ้าคุณใช้เมล็ดเดียวกันเมื่อคุณเริ่มคุณจะได้รับลำดับที่เหมือนกันกลับมา สิ่งนี้มีประโยชน์มากสำหรับการทดสอบ
srand(5332)
หมายเลขถัดไปที่ส่งกลับrand
จะเป็นหมายเลขเดิมเสมอ
คุณกำลังขอ Pseudorandom หรือ Random คนอื่น ๆ ตอบเกี่ยวกับการลอกเลียนแบบสุ่ม, ให้ฉันพูดเกี่ยวกับการสุ่ม
มีการจำหน่ายเครื่องกำเนิดตัวเลขสุ่มที่ใช้ฮาร์ดแวร์จริง พวกมันใช้ชิพที่มีคลื่นวิทยุขนาดเล็กวัดเสียงสีขาวของการแผ่รังสีในห้วงอวกาศหรือตัวอย่างกัมมันตภาพรังสีขนาดเล็กและช่วงการวัดระหว่างการสลายตัว ปัญหาที่เกิดขึ้นกับพวกเขาคือแบนด์วิดธ์ - ปริมาณของเอนโทรปีที่พวกเขาสามารถสร้างได้ไม่สูงมากดังนั้นพวกมันจึงถูกใช้เป็นเมล็ดของอัลกอริธึมหลอกเทียม พวกเขาถูกนำมาใช้ในระบบธนาคารความปลอดภัยสูงและชอบ
OTOH ถ้าคุณพบนักพัฒนาระบบฝังตัวพวกเขาจะหัวเราะเยาะสิ่งเหล่านี้ สำหรับจุดประสงค์ทั่วไปในการเขียนโปรแกรมไมโครคอนโทรลเลอร์การอ่านตัวแปลงอนาล็อก - ดิจิตอลแบบ 16 บิตขนาดต่ำ 4 บิตที่มีขาแบบลอย (ไม่เชื่อมต่อ) จะสร้างเสียงแบบสุ่มที่ดีอย่างสมบูรณ์ที่แบนด์วิดท์ที่เพียงพอ มีเสียงดัง "การอ่านข้อมูล) และง่ายกว่าการเขียนรูทีน RNG จริง และเมื่อพิจารณาว่า ADC นั้นมักพบว่ามีการใช้งานในซิลิคอนของไมโครคอนโทรลเลอร์ที่ใช้งานทั่วไปและมักจะใช้งานกับ 8 ช่องสัญญาณที่คุณต้องการอาจจะ 5 สำหรับแอปพลิเคชันของคุณ
และแม้ว่าคุณจะไม่มี ADC องค์ประกอบบางอย่างที่เชื่อมต่อกับพิน GPIO ดิจิตอลจะให้เสียงที่ดีพอสมควร เสียงที่ฝังอยู่ในเสียงนั้นมีอยู่ตลอดเวลา (และต่อสู้อย่างต่อเนื่อง) และการได้รับการสุ่มอย่างแท้จริงนั้นง่ายมาก
มีหลายวิธีในการพยายามจำลองลำดับของตัวเลข "แบบสุ่ม" จุดแรกของคุณควรอ่านเกี่ยวกับเครื่องกำเนิดไฟฟ้าเชิงเส้นเชิงเส้นแน่นอน นี่คือการทำงานของตัวสร้างตัวเลขสุ่มขั้นพื้นฐานส่วนใหญ่และฉันคิดว่ามันเป็นวิธีการทำงานของ PHP (rand ())
คำถามต่อไปที่น่าสนใจที่จะไตร่ตรองก็คือมันมีเมล็ดได้อย่างไร? เวลา? ที่อยู่ IP? เป็นต้น
RANDOMIZE TIMER
เป็นสำนวนทั่วไปและ "ดีพอ" สำหรับวัตถุประสงค์ส่วนใหญ่ (ไม่ใช่การเข้ารหัส) ตามคำสั่งman 3 srandไลบรารี GNU C ใช้เมล็ดที่ตายตัวเป็น 1 จนกว่าจะมีการดำเนินการ PRNG อีกครั้ง
ประการแรกrand()
ฟังก์ชั่นแทบทั้งหมดไม่ได้ให้การสุ่มอย่างแท้จริง แต่จะให้การสุ่มตัวเลขที่เรียกว่าหลอก
ดังนั้นเครื่องกำเนิดเลขสุ่มหลอกทำงานอย่างไร โดยพื้นฐานในลักษณะเดียวกับที่การเข้ารหัสใช้งานได้: คุณมีฟังก์ชั่น (แฮช) ที่รับอินพุตและสร้างเอาต์พุตบางส่วนในลักษณะที่ซับซ้อนซึ่งเป็นไปไม่ได้จากเอาต์พุตที่จะเดาอินพุตหรือในทางกลับกัน นั่นคือไซเฟอร์ทุกตัวสามารถใช้ในการสร้างเครื่องกำเนิดไฟฟ้าแบบหลอกหลอกได้ค่อนข้างดี อย่างไรก็ตามในขณะที่คุณสามารถใช้เครื่องกำเนิดไฟฟ้าแบบหลอกหลอกใด ๆ ในการเข้ารหัสหลักการเครื่องกำเนิดตัวเลขแบบหลอกเทียมส่วนใหญ่ได้รับการพัฒนาเป็นหลักเพื่อความรวดเร็วไม่ใช่ความปลอดภัยแบบเข้ารหัสดังนั้นพวกเขาจะไม่ให้แฮกเกอร์ปวดหัว
สำหรับเครื่องกำเนิดไฟฟ้าแบบหลอกหลอกฟังก์ชัน hashing จะถูกนำไปใช้กับสถานะภายในของเครื่องกำเนิดไฟฟ้าที่ซ่อนอยู่บางส่วนและเอาท์พุทของมันถูกใช้กับ a) ปรับเปลี่ยนสถานะภายในนั้นและ b) เพื่อคำนวณเอาท์พุทของrand()
ฟังก์ชัน การเรียกrand()
ใช้ครั้งต่อไปของจะใช้การเปลี่ยนแปลงสถานะภายในและทำให้เกิดผลลัพธ์ที่แตกต่างกัน ยิ่งฟังก์ชั่นแฮชดีขึ้นผลลัพธ์ที่ได้ก็จะแตกต่างจากตัวเลขสุ่มจริงที่ง่ายกว่า
ตามความเป็นจริงแล้วคอมพิวเตอร์ทุกวันนี้มีการเข้าถึงตัวเลขสุ่มจริง ๆ : พวกมันมาจากความกระวนกระวายใจในช่วงเวลาของการขัดจังหวะที่ผลิตโดยอุปกรณ์ภายนอก Linux ใช้ค่าความไม่แน่นอนเล็ก ๆ เหล่านี้เพื่อกระตุ้น "เอนโทรปีพูล" ซึ่งเป็นสถานะภายในเพียงไม่กี่กิโลไบต์ การเข้ารหัสลับแฮชที่ใช้พูลเอนโทรปีนี้มีให้ผ่านทาง/dev/random
และ/dev/urandom
อุปกรณ์ ดังนั้นการเข้าถึงตัวเลขสุ่มที่ดีจริงๆได้นั้นง่ายพอ ๆ กับการเปิดหนึ่งในสองอุปกรณ์นี้และอ่านไบต์จากพวกเขา
ตัวเลขสุ่มคือตัวเลขที่สร้างขึ้นโดยกระบวนการที่เอาท์พุทไม่แน่นอน นั่นคือเราไม่สามารถบอกได้ว่าอะไรจะเป็นผลลัพธ์ต่อไป เราสามารถนำผลตัวอย่างง่ายๆของลูกเต๋ามาใช้ สิ่งที่จะออกมาเมื่อเราโยนลูกเต๋านั้นไม่อาจคาดเดาได้
หมายเลขสุ่มมีสองประเภท 1. หมายเลขสุ่มจริง 2. หมายเลขสุ่มหลอก