เครื่องกำเนิดตัวเลขสุ่มทำงานอย่างไร


23

ฉันแค่ไตร่ตรองเกี่ยวกับrand()ฟังก์ชั่นPHP และคิดเกี่ยวกับวิธีที่ฉันสามารถสร้างมันขึ้นมาใหม่และฉันก็ประหลาดใจอย่างสมบูรณ์

เครื่องกำเนิดตัวเลขสุ่มทำงานอย่างไร


2
เครื่องกำเนิดเลขสุ่มหลอกใช้เมล็ดตารางค่าคงที่ที่กำหนดไว้ล่วงหน้าและสูตรทางคณิตศาสตร์ เครื่องกำเนิดจำนวนสุ่มจริงมักจะใช้เสียงบรรยากาศ คุณสามารถรับตัวเลขสุ่มจากการอ่าน / dev / สุ่ม
rightfold

เสียงรบกวนในบรรยากาศรับประกันว่าจะสุ่มหรือไม่?

2
random.org มีการสนทนาที่ดีงามในการสุ่มตัวเลขและวิธีการที่พวกเขากำลังสร้าง
CanSpice

14
function rand() { return 4; /* determined by die roll - guaranteed to be random */ }
Neil

3
ใครบางคนต้องทำเช่นนี้: xkcd.com/221 ;)
Valera Kolupaev

คำตอบ:


7

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

หวังว่านี่จะช่วยได้!


7
การกระทำของการgodสุ่มอย่างน้อยจะเป็นอย่างไร? ยิ่งไปกว่านั้นฟ้าผ่าไม่ได้สุ่มอย่างใดอย่างหนึ่งตามเส้นทางที่กำหนดโดยเงื่อนไขต่าง ๆ นอกจากนี้ล่ามที่สร้างหมายเลขนั้นไม่เกี่ยวข้องโดยพื้นฐานแล้ว

7
ฉันใช้การกระทำของพระเจ้าในแง่กฎหมาย: en.wikipedia.org/wiki/Act_of_God พวกเขาได้รับการพิจารณาแบบสุ่มเนื่องจากอยู่นอกเหนือการควบคุมของมนุษย์

4
โดยพื้นฐานแล้วไม่มีอะไรที่จะสุ่ม แต่นั่นจะต้องได้รับอิทธิพลจากการสุ่มทุกครั้งดูเหมือนจะไม่ได้ผลเมื่อคุณไปถึงจุดเริ่มต้น ... ดูเหมือนว่าฉันจะเรียนวิชาปรัชญา = D

6
@Korvin เท่าที่เราทราบปรากฏการณ์ควอนตัมเช่นการสลายตัวของกัมมันตภาพรังสีหรือการปล่อยโฟตอนโดยอะตอมที่ตื่นเต้นนั้นเป็นการสุ่มอย่างแท้จริง อย่างไรก็ตามนักคณิตศาสตร์และนักปรัชญาโต้เถียงว่าการสุ่มอย่างแท้จริงหมายความว่าอย่างไร และในขณะที่คนธรรมดา ๆ คิดว่าการโยนเหรียญเป็นนักมายากลบนเวทีแบบสุ่ม ( news.stanford.edu/pr/2004/diaconis-69.html ) ที่สุ่มสามารถรับ 10 หัวในการโยน 10 ครั้ง
Charles E. Grant

1
@Charles - การโยนเหรียญไม่ได้เป็นแม้แต่หัวไบนารี / ก้อย แต่จริงๆแล้วหัว / ก้อย / ขอบดังนั้นนักมายากลบนเวทีที่ดีจริงๆสามารถทำให้มันลงมาได้ไม่ว่าจะหัวหรือก้อย * 8 ')
Mark Booth

18

พวกเขามักจะไม่สุ่มอย่างแท้จริง แต่จะเรียกว่าหลอกหลอกเพราะพวกเขาสร้างลำดับหมายเลขที่ปรากฏแบบสุ่ม นี่คือสูตรทางคณิตศาสตร์ที่น่าสนใจ หนึ่งที่พบมากที่สุดคือการเชิงเส้น congruential ปั่นไฟ

ตัวเลขสุ่มหลอกมีคุณสมบัติที่มีประโยชน์อย่างหนึ่งที่หมายเลขสุ่มจริงไม่ได้: ถ้าคุณใช้เมล็ดเดียวกันเมื่อคุณเริ่มคุณจะได้รับลำดับที่เหมือนกันกลับมา สิ่งนี้มีประโยชน์มากสำหรับการทดสอบ


หากฉันเข้าใจข้อความที่สองของคุณถูกต้อง: random(5332)จะเท่ากับrandom(5332)หรือไม่

2
@Korvin ไม่ฉันหมายความว่าถ้าคุณโทรหาsrand(5332)หมายเลขถัดไปที่ส่งกลับrandจะเป็นหมายเลขเดิมเสมอ
Mark Ransom

3
"ปรากฏแบบสุ่ม" -> มีคุณสมบัติทางสถิติเช่นเดียวกับตัวเลขสุ่มอย่างแท้จริง

+1 สำหรับลิงก์ LGC Wikipedia นี่เป็นแอนิเมชั่นที่ยอดเยี่ยมว่าทำไม PRNG ง่าย ๆ จึงมีข้อ จำกัด ที่ร้ายแรงเมื่อทำการจำลองแบบ Monte-Carlo แบบหลายมิติ
Mark Booth

4

คุณกำลังขอ Pseudorandom หรือ Random คนอื่น ๆ ตอบเกี่ยวกับการลอกเลียนแบบสุ่ม, ให้ฉันพูดเกี่ยวกับการสุ่ม

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

OTOH ถ้าคุณพบนักพัฒนาระบบฝังตัวพวกเขาจะหัวเราะเยาะสิ่งเหล่านี้ สำหรับจุดประสงค์ทั่วไปในการเขียนโปรแกรมไมโครคอนโทรลเลอร์การอ่านตัวแปลงอนาล็อก - ดิจิตอลแบบ 16 บิตขนาดต่ำ 4 บิตที่มีขาแบบลอย (ไม่เชื่อมต่อ) จะสร้างเสียงแบบสุ่มที่ดีอย่างสมบูรณ์ที่แบนด์วิดท์ที่เพียงพอ มีเสียงดัง "การอ่านข้อมูล) และง่ายกว่าการเขียนรูทีน RNG จริง และเมื่อพิจารณาว่า ADC นั้นมักพบว่ามีการใช้งานในซิลิคอนของไมโครคอนโทรลเลอร์ที่ใช้งานทั่วไปและมักจะใช้งานกับ 8 ช่องสัญญาณที่คุณต้องการอาจจะ 5 สำหรับแอปพลิเคชันของคุณ

และแม้ว่าคุณจะไม่มี ADC องค์ประกอบบางอย่างที่เชื่อมต่อกับพิน GPIO ดิจิตอลจะให้เสียงที่ดีพอสมควร เสียงที่ฝังอยู่ในเสียงนั้นมีอยู่ตลอดเวลา (และต่อสู้อย่างต่อเนื่อง) และการได้รับการสุ่มอย่างแท้จริงนั้นง่ายมาก


2

มีหลายวิธีในการพยายามจำลองลำดับของตัวเลข "แบบสุ่ม" จุดแรกของคุณควรอ่านเกี่ยวกับเครื่องกำเนิดไฟฟ้าเชิงเส้นเชิงเส้นแน่นอน นี่คือการทำงานของตัวสร้างตัวเลขสุ่มขั้นพื้นฐานส่วนใหญ่และฉันคิดว่ามันเป็นวิธีการทำงานของ PHP (rand ())

คำถามต่อไปที่น่าสนใจที่จะไตร่ตรองก็คือมันมีเมล็ดได้อย่างไร? เวลา? ที่อยู่ IP? เป็นต้น


เมล็ดคือสิ่งที่ทำให้ฉันสับสนฉันไม่สามารถนึกถึงสิ่งใดที่สามารถเพาะเมล็ดฟังก์ชันได้โดยไม่มีรูปแบบบางอย่างและแม้ว่าจะไม่ใช่ก็ตามสิ่งที่ทำให้เมล็ดแบบสุ่มเกิดขึ้นตั้งแต่แรก!

3
ฉันเชื่อว่าการประทับเวลามักใช้เป็นเมล็ดเริ่มต้นเมื่อไม่มีการจัดหาจริงจากแหล่งอื่น ในภาษาเบสิกเก่าRANDOMIZE TIMERเป็นสำนวนทั่วไปและ "ดีพอ" สำหรับวัตถุประสงค์ส่วนใหญ่ (ไม่ใช่การเข้ารหัส) ตามคำสั่งman 3 srandไลบรารี GNU C ใช้เมล็ดที่ตายตัวเป็น 1 จนกว่าจะมีการดำเนินการ PRNG อีกครั้ง
CVn

1

ประการแรกrand()ฟังก์ชั่นแทบทั้งหมดไม่ได้ให้การสุ่มอย่างแท้จริง แต่จะให้การสุ่มตัวเลขที่เรียกว่าหลอก

ดังนั้นเครื่องกำเนิดเลขสุ่มหลอกทำงานอย่างไร โดยพื้นฐานในลักษณะเดียวกับที่การเข้ารหัสใช้งานได้: คุณมีฟังก์ชั่น (แฮช) ที่รับอินพุตและสร้างเอาต์พุตบางส่วนในลักษณะที่ซับซ้อนซึ่งเป็นไปไม่ได้จากเอาต์พุตที่จะเดาอินพุตหรือในทางกลับกัน นั่นคือไซเฟอร์ทุกตัวสามารถใช้ในการสร้างเครื่องกำเนิดไฟฟ้าแบบหลอกหลอกได้ค่อนข้างดี อย่างไรก็ตามในขณะที่คุณสามารถใช้เครื่องกำเนิดไฟฟ้าแบบหลอกหลอกใด ๆ ในการเข้ารหัสหลักการเครื่องกำเนิดตัวเลขแบบหลอกเทียมส่วนใหญ่ได้รับการพัฒนาเป็นหลักเพื่อความรวดเร็วไม่ใช่ความปลอดภัยแบบเข้ารหัสดังนั้นพวกเขาจะไม่ให้แฮกเกอร์ปวดหัว

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


ตามความเป็นจริงแล้วคอมพิวเตอร์ทุกวันนี้มีการเข้าถึงตัวเลขสุ่มจริง ๆ : พวกมันมาจากความกระวนกระวายใจในช่วงเวลาของการขัดจังหวะที่ผลิตโดยอุปกรณ์ภายนอก Linux ใช้ค่าความไม่แน่นอนเล็ก ๆ เหล่านี้เพื่อกระตุ้น "เอนโทรปีพูล" ซึ่งเป็นสถานะภายในเพียงไม่กี่กิโลไบต์ การเข้ารหัสลับแฮชที่ใช้พูลเอนโทรปีนี้มีให้ผ่านทาง/dev/randomและ/dev/urandomอุปกรณ์ ดังนั้นการเข้าถึงตัวเลขสุ่มที่ดีจริงๆได้นั้นง่ายพอ ๆ กับการเปิดหนึ่งในสองอุปกรณ์นี้และอ่านไบต์จากพวกเขา


-2

ตัวเลขสุ่มคือตัวเลขที่สร้างขึ้นโดยกระบวนการที่เอาท์พุทไม่แน่นอน นั่นคือเราไม่สามารถบอกได้ว่าอะไรจะเป็นผลลัพธ์ต่อไป เราสามารถนำผลตัวอย่างง่ายๆของลูกเต๋ามาใช้ สิ่งที่จะออกมาเมื่อเราโยนลูกเต๋านั้นไม่อาจคาดเดาได้

หมายเลขสุ่มมีสองประเภท 1. หมายเลขสุ่มจริง 2. หมายเลขสุ่มหลอก

วิธีสุ่มตัวเลขจะถูกสร้างขึ้น


1
โปรดใช้การจัดรูปแบบเครื่องหมายคำพูดเพื่อเน้นว่าส่วนใดของคำตอบที่เป็นของคุณและมาจากแหล่งที่คุณอ้างถึง หากคำตอบทั้งหมดของคุณเป็นสำเนา / วางจากแหล่งภายนอกก็ไม่ใช่คำตอบที่ดีที่นี่
Mat

นี้ไม่ได้ดูเหมือนจะนำเสนออะไรที่สำคัญกว่าจุดทำและอธิบายในก่อน 6 คำตอบ
ริ้น
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.