Fortuna หรือ Mersenne Twister เป็นที่นิยมในฐานะอัลกอริทึม RNG หรือไม่?


19

คำตอบที่ผ่านมากล่าวถึงการใช้งานของFortunaหรือMersenne Twisterจำนวนสุ่มปั่นไฟ ( RNGs ) เพื่อเมล็ดจำลอง Monte Carlo ฉันไม่เคยได้ยิน Fortuna มาก่อนดังนั้นฉันจึงค้นหามัน - ดูเหมือนว่ามันมีไว้สำหรับการใช้งานการเข้ารหัสลับเป็นหลัก

ปัจจุบันฉันใช้ Mersenne Twister ในรหัสการผลิตเพื่อเริ่มต้นอัลกอริทึม K-Means

(Fortuna หรือ Mersenne Twister) ใดที่ถือว่าดีที่สุดสำหรับแอปพลิเคชัน "การสร้างอัลกอริทึม" (เช่นการเพาะเมล็ด Monte Carlo และ K-Means) หรือมันคือ "toss up" - เช่นใช้สะดวกที่สุด

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


6
PRNG ที่เข้ารหัสลับมีแนวโน้มที่จะช้ากว่า PRNG อื่น ๆ ส่วนใหญ่ หากคุณกำลังจำลอง Monte Carlo ที่หมายเลข PRNG ของคุณทำงานเป็นล้านคุณจะพบว่าวิธีการเข้ารหัสลับมีราคาแพงมาก
JM

1
@JM - ด้วยรายละเอียดเล็ก ๆ น้อย ๆ ฉันคิดว่าความคิดเห็นของคุณจะเป็นคำตอบที่ดี แน่นอนว่ามันน่าสนใจที่จะดูว่าสามารถใช้ฟังก์ชัน crypto เร่งความเร็วฮาร์ดแวร์ที่ทันสมัยเพื่อสร้างสตรีมประสิทธิภาพสูงของการสุ่มหลอกตัวเลขที่เข้ารหัสลับปลอดภัยหรือไม่
Mark Booth

@JM จุดดีเกี่ยวกับการเข้ารหัสลับ RNGs ช้า - ทำเครื่องหมายกับ Fortuna
winwaed

นี่คือรายการที่ดีของ PRNG และสถิติอื่น ๆ อีกมากมายที่คุณอาจพบว่ามีประโยชน์หวังว่ามันจะช่วย> boost.org/doc/libs/1_48_0/doc/html/boost_random/…
pyCthon

ปัญหาของฉันกับ cstdlib คือความละเอียด - RAND_MAX=32768ค่าที่เป็นไปได้เท่านั้น ขณะนี้ฉันกำลังใช้ MT สำหรับซิมมอนเตคาร์โลเรย์ติงซิม แต่ผมไม่เห็นมอนแทนาเป็นขวดประสิทธิภาพในการสร้างโปรไฟล์ของฉันอาจจะเป็นเพราะผมทำรุ่น "สุ่ม" สิ่งที่ต้องการทิศทาง ray เป็น preprocess ตัวอย่างเช่นฉันอาจสร้างอาเรย์จำนวน 100,000 ลำเมื่อเริ่มต้นเก็บไว้ในอาเรย์และเลือกตำแหน่งเริ่มต้นอาเรย์แบบสุ่มที่รันไทม์ (ใช้งาน 10,000 เรย์หรือของสะสม) นี่เป็นค่าใช้จ่ายที่ค่อนข้างสูงของหน่วยความจำเพื่อแลกกับการแจกแจงตัวเลขแบบสุ่มที่ดี
bobobobo

คำตอบ:


14

ทีนี้ทุกอย่างเป็นการแลกเปลี่ยนอะไรบางอย่าง สำหรับตัวสร้างตัวเลขสุ่มฉันจัดกลุ่มพวกมันออกเป็น 3 ประเภทพื้นฐาน

  1. ดีพอสำหรับการบ้าน
  2. ดีพอที่จะเดิมพัน บริษัท ของคุณ
  3. ดีพอที่จะเดิมพันประเทศของคุณ

PRNGs เชิงเส้นตรง (วิธีการที่ใช้โดยทั่วไปในห้องสมุดส่วนใหญ่) อยู่ในหมวดที่ 1 อย่างแน่นหนาทั้ง Fortuna และ Mersenne Twister มีความสมบูรณ์ในหมวดที่ 2

สำหรับบทความที่น่าสนใจเกี่ยวกับวิธี messing up ขั้นตอนวิธีการสับสามารถเสียค่าใช้จ่าย บริษัท / คาสิโน, ผมขอแนะนำหนึ่งจาก 1999 เนื่องจากการเชื่อมโยงที่เน่าภาพจะหายไป แต่รูปที่ 4 ซึ่งเป็นจุดที่คุณพล็อตหมายเลขถัดไปจาก PRNG เทียบกับหมายเลขก่อนหน้านี้ที่สร้างขึ้นเป็นชุดของเส้นคู่ขนาน

ในขณะที่ JM ชี้ให้เห็น Fortuna นั้นช้า ในขณะที่คุณได้ชี้ให้เห็น Mersenne Twister นั้นเร็วพอสมควร


2
อ่านอย่างรวดเร็วผ่านเวอร์ชันที่พิมพ์ได้ของบทความดูเหมือนว่า "รูปที่ 4" จะเป็นรหัสแทนที่จะเป็นรูปภาพ "รูปที่ 5" รูปลักษณ์ kaput แต่นี้เป็นภาพที่ผมได้รับจากเครื่อง Wayback
JM

ขอบคุณ ดูเหมือนว่าความเร็วจะเป็นเครื่องหมายของ Fortuna ในกรณีนี้ เรื่อง Bad shuffles: ใช่ฉันรู้มากพอ (ไม่มาก!) ว่ามันง่ายที่จะ "เลิกทำ" การสุ่มของ RNG - ตัวอย่างเช่นโดยการเลือกเมล็ดเริ่มต้นที่ไม่ดี
winwaed

รุ่นอื่นที่มีรูปภาพที่ดีกว่าอยู่ที่: cigital.com/papers/download/developer_gambling.php
Tangurena

1
LCG 96 บิตพร้อมเอาต์พุต 32 บิตผ่านการทดสอบทางสถิติมากกว่า Mersenne Twisters ไม่มีใครควรใช้ Mersenne Twister ในปัจจุบันเนื่องจากง่ายต่อการสร้าง PRNG ที่ไม่มีการเข้ารหัสที่ดีซึ่งดีกว่า MT ในทุกแง่มุมที่มีความหมาย
Veedrac

4

ตัวเลือกเริ่มต้นในหมวดหมู่ "เข้ารหัส" คือBlum-Blum-Shubฉันคิดว่า ดังที่หน้าวิกิพีเดียบอกไว้แล้วนี่ไม่เหมาะสำหรับการจำลองเพราะมันช้าเกินไป

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

แนวคิดของการผสมแบบสุ่มแสดงให้เห็นว่ามันอาจเป็นไปได้ที่จะได้รับสิ่งที่ดีที่สุดของโลกทั้งสองดังต่อไปนี้ ใช้ตัวสร้างตัวเลขสุ่มที่มีคุณภาพดีขึ้นอย่างสมเหตุสมผลเช่น Mersenne เป็น RNG พื้นฐานของคุณ รักษาตัวสร้างตัวเลขสุ่มตัวที่สองที่มีคุณภาพดีกว่าเช่น - Fortuna ทุกตัวเลขจำนวนมากพูด 25 เรียกใช้หนึ่งซ้ำของ RNG ที่ดีกว่าและเพิ่มผลลัพธ์เข้าสู่สถานะของ RNG พื้นฐานของคุณ วิธีนี้คุณจะได้รับประสิทธิภาพสูงและผลลัพธ์ที่มีคุณภาพค่อนข้างสูง (ฉันเดาว่าคงไม่มีประโยชน์อะไรกับ crypto เนื่องจากความแรงของตัวสร้างคอมโพสิตนี้อาจเป็นจุดแข็งของจุดอ่อนที่สุด แต่สำหรับการจำลองซึ่งคุณมักไม่มีศัตรูที่อันตรายมันอาจใช้งานได้)


/ dev / urandom มีความปลอดภัยในการใช้สำหรับการเข้ารหัสบน linux และ free-bsd ดูคำตอบนี้
Adam Kurkiewicz

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

2

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


0

ฉันคิดว่าคำตอบนั้นขึ้นอยู่กับแอปพลิเคชันที่คุณต้องการให้ RNG ใช้ ฉันขอแนะนำหมวดหมู่ที่สี่สำหรับการจัดหมวดหมู่คร่าวๆของ Tangurena: "ดีโดยไม่มีกำไรจริง"

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

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