หมายเลข 161803398 A เป็น 'พิเศษ' หรือไม่ ด้านในของคณิตศาสตร์สุ่ม ()


162

ฉันสงสัยว่าคำตอบคือ ' เพราะคณิตศาสตร์ ' แต่ฉันหวังว่าบางคนสามารถให้ข้อมูลเชิงลึกมากขึ้นในระดับพื้นฐาน ...

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

แหล่งข้อมูลเต็มรูปแบบที่นี่: http://referencesource.microsoft.com/#mscorlib/system/random.cs#29

private const int MSEED = 161803398; 

ค่า MSEED นี้ใช้ทุกครั้งที่มีการสุ่มคลาส () คลาส

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

ฉันพยายามค้นหาหมายเลขใน Google แต่ไม่พบอะไรเลย



6
@ 48klocs: มันพูดอย่างนั้นในเอกสาร :The current implementation of the Random class is based on Donald E. Knuth's subtractive random number generator algorithm. For more information, see D. E. Knuth. "The Art of Computer Programming, volume 2: Seminumerical Algorithms". Addison-Wesley, Reading, MA, second edition, 1981.
Jesse Good

4
@ 48klocs ใช่หน้า 283 ที่นี่: apps.nrbook.com/c/index.htmlเหตุผลของเขาดูเหมือนจะเป็น "เพราะคณิตศาสตร์"
eshs

22
@eshs: ข้อเท็จจริงที่น่าสนใจ: หน้า 283 ของลิงค์ของคุณแสดงinextp = 31;แต่ซอร์สโค้ดของRandomคลาสนั้นเป็นinextp = 21;เพราะมีบางคนพิมพ์ผิดมันทำให้เกิดข้อผิดพลาดนี้
Jesse Good

7
@Izkata เราจำเป็นต้องให้ความรู้แก่ผู้ใช้เกี่ยวกับพฤติกรรมที่ถูกต้อง (ของการไม่ลงคะแนนเพื่อปิดอย่างไม่เหมาะสม) สำหรับเป้าหมายคุณภาพเว็บไซต์ในระยะยาวไม่ใช่แค่มุ่งไปที่เป้าหมายระยะสั้นเท่านั้น และถ้าฉันไม่ได้ชี้ให้เห็นความคิดเห็นข้างต้นมันอาจจะปิดไปซ้ำเพราะคนทำอย่างนั้นบางครั้ง
Bernhard Barker

คำตอบ:


141

ไม่ แต่มันขึ้นอยู่กับพี ("อัตราส่วนทองคำ")

161803398 = 1.61803398 * 10^8  φ * 10^8

เพิ่มเติมเกี่ยวกับอัตราส่วนทองคำที่นี่

และจริงๆอ่านที่ดีสำหรับนักคณิตศาสตร์สบาย ๆ ที่นี่

และฉันก็พบบทความวิจัยเกี่ยวกับเครื่องกำเนิดเลขสุ่มที่เห็นด้วยกับการยืนยันนี้ (ดูหน้า 53)


17
คุณรู้หรือไม่ว่าทำไมตัวเลขจากพีจึงเป็นทางเลือกที่ดีในฐานะเมล็ดพันธุ์ เป็นไปได้ไหมที่จะสรุปสิ่งนี้ที่นี่
Bernhard Barker

29
@Dukeling ค่าคงที่ถูกใช้เพียงครั้งเดียวเพื่อให้เมล็ดที่เข้ามา ความสงสัยที่แข็งแกร่งมากของฉันคือมันได้รับเลือกให้เป็นหมายเลขแขนเสื้อของฉันที่ป้องกันไม่ให้เมล็ดที่มีการตั้งค่าไม่กี่บิต (อาจเป็นทางเลือกทั่วไป) จากการทำให้เครื่องกำเนิดหมายเลขสุ่มผิดพลาด
David Eisenstat

7
หากต้องการอ้างอิงข้อความจากหนังสือดังกล่าวตาม Knuth MBIG ขนาดใหญ่และขนาดเล็ก (แต่ยังใหญ่) MSEED ใด ๆ ก็สามารถใช้แทนค่าดังกล่าวได้ ดังนั้นมันจึงเป็นความสนุกทางคณิตศาสตร์มากหรือน้อย .. ดังนั้นคำตอบที่ถูกต้องควรเป็น: ไม่ แต่มันขึ้นอยู่กับพี
TaW

14
ลองดูที่กระดาษตัวเลขสุ่ม - บรรทัดนี้โดดเด่นนิดหน่อย - "One can’t even fathom the repercussions if security flaws in the implementation (or design) of the SSL protocol are to be found."(หน้า 4)
jcw

2
ฉันคิดว่าวิธีที่เกี่ยวข้องมากขึ้นในการใช้อัตราส่วนทองคำคือการใช้ (โมดูลัส / พี) แทนที่จะใช้การแสดงฐาน -10 ของตัวเลขในรหัสที่ไม่มีส่วนเกี่ยวข้องกับฐาน 10 คุณลักษณะที่น่าสนใจของพีที่ ฉันไม่เห็นในหน้านั้นคือสิ่งที่ฉันสามารถบอกได้สำหรับจำนวนเต็ม N ใด ๆ ค่า N / phi-int (N / phi)> = 1 / N / sqrt (5) นั่นหมายความว่าแม้ว่าจะมีการสร้างลำดับของตัวเลข N / phi-int (N / phi) ระยะห่างระหว่างคู่ที่ใกล้ที่สุดจะอยู่ภายในปัจจัยของ sqrt (5) ของระยะห่างที่สม่ำเสมอที่สุดที่เป็นไปได้ในช่วงเวลา ( 0..1)
supercat

62

จำนวนนี้นำมาจากอัตราส่วนทองคำ 1.61803398 * 10 ^ 8 Matt ให้คำตอบที่ดีตัวเลขนี้คืออะไรดังนั้นฉันจะอธิบายเกี่ยวกับอัลกอริทึมนิดหน่อย

นี่ไม่ใช่หมายเลขพิเศษสำหรับอัลกอริทึมนี้ อัลกอริธึมคืออัลกอริธึมกำเนิดจำนวนลบแบบสุ่มของ Knuthและประเด็นหลักของมันคือ:

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

ตัวกำเนิดขึ้นอยู่กับการเรียกซ้ำต่อไปนี้: X n = (X n-55 - X n-24 ) mod m โดยที่≥ 0 นี่เป็นกรณีบางส่วนของตัวสร้างFibonacci ที่ล้าหลัง : X n = (X n-j @ X n-k ) mod m โดยที่ 0 <k <j และ @ คือการดำเนินการแบบไบนารีใด ๆ (การลบการบวกนอกจากนี้ xor)

มีการใช้งานหลายอย่างของเครื่องกำเนิดไฟฟ้านี้ Knuth เสนอการใช้งานใน FORTRAN ในหนังสือของเขา ฉันพบรหัสต่อไปนี้พร้อมกับความคิดเห็นต่อไปนี้:

พารามิเตอร์ (MBIG = 1000000000, MSEED = 161803398, MZ = 0, FAC = 1.E-9)

ตาม Knuth MBIG ขนาดใหญ่ใด ๆ และ MSEED ขนาดเล็ก (แต่ยังคงมีขนาดใหญ่) ใด ๆ สามารถทดแทนค่าดังกล่าวได้

มีอีกเล็กน้อยที่นี่โปรดทราบว่านี่ไม่ใช่งานวิจัยจริง ๆ (ตามที่ระบุไว้โดยคณิตศาสตร์) นี่เป็นเพียงวิทยานิพนธ์ระดับปริญญาโท

คนที่อยู่ในการเข้ารหัสเช่นการใช้จำนวนอตรรกยะ ( pi, e, sqrt(5)) เนื่องจากมีการคาดเดาว่าตัวเลขของตัวเลขดังกล่าวปรากฏขึ้นพร้อมกับความถี่ที่เท่าเทียมกันและทำให้มีสูงเอนโทรปี คุณสามารถค้นหาคำถามที่เกี่ยวข้องกับความปลอดภัย stack แลกเปลี่ยนเพื่อเรียนรู้เพิ่มเติมเกี่ยวกับตัวเลขดังกล่าว นี่คือคำพูด:

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


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