คุณภาพของเครื่องกำเนิดไฟฟ้าเชิงเส้นเชิงเส้นสำหรับตัวเลขสุ่ม


14

ฉันกำลังจำลองสถานการณ์ของสมการ Langevin สำหรับกองกำลังภายนอกต่างๆ ด้วยการบอกว่า C rand()จากstdlib.hสามารถนำความลำเอียงในผลลัพธ์ของฉันฉันใช้ Mersenne Twister

อย่างไรก็ตามฉันอยากจะรู้ (และดู) ว่าข้อผิดพลาดชนิดใดที่เครื่องกำเนิดไฟฟ้าเชิงเส้นเชิงเส้นสามารถแนะนำในการจำลองของฉัน นี่คือสิ่งที่ฉันได้ลอง:

  • สร้าง tuples 3 มิติของ randoms เพื่อลองดูไฮเปอร์เพลน ฉันไม่เห็นอะไรเลย
  • ทำ FFT ของเวกเตอร์ขนาดใหญ่ที่มีตัวเลขสุ่ม มันเกือบจะเหมือนกันสำหรับทั้ง Mersenne Twister rand()และ
  • ตรวจสอบหลักการของควอเตชันสำหรับการเคลื่อนที่แบบบราวเนียน ผู้รวมระบบทั้งสองตกลงในค่าที่คาดหวังของมีตัวเลขนัยสำคัญเท่ากันKE=12kBT
  • มาดูกันว่าถังขยะในถังขยะจำนวนหนึ่งนั้นมีกำลังดีแค่ไหน ทั้งสองให้ผลลัพธ์เชิงคุณภาพเดียวกันไม่มีใครดีกว่า
  • มองไปที่เส้นทาง Brownian ที่จะเห็นความแตกต่างที่ชัดเจนจาก 0 ไม่มีโชคอีกแล้วx=0
  • การกระจายของคะแนนเป็นวงกลม เต็มและเฉพาะในปริมณฑล ระหว่างพวกเขาทั้งหมดและระหว่างเพื่อนบ้านที่ใกล้ที่สุด (คำตอบของ Shor ด้านล่างในความคิดเห็น) มีอยู่ในส่วนสำคัญนี้เพียงแค่เรียกใช้กับ Julia 0.5.0 หลังจากติดตั้งไลบรารีที่จำเป็น (ดูส่วนสำคัญสำหรับคำแนะนำ)

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

คุณมีตัวอย่างที่เป็นรูปธรรมและเป็นรูปธรรมหรือไม่เกี่ยวกับวิธีการสร้างตัวสุ่มตัวเลขที่ไม่ดีทำลายการจำลอง Montecarlo หรือไม่?

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


1
ไม่มีตัวอย่างที่คุณร้องขอ แต่ใช้ drand48 () / srand48 () แทนที่จะใช้ rand () / srand () ในโปรแกรม C ของฉันเอง man pages ของพวกเขาเป็นเอกสารเกี่ยวกับอัลกอริทึม prng ต่างๆที่ใช้ (ดู man random สำหรับอัลกอริธึมของ rand) และฉันเชื่อว่า drand48 นั้นเป็นที่นิยมมากกว่าแม้ว่าความเข้าใจโดยละเอียดของฉันจะเล็กน้อย เมื่อฉันต้องการรับประกันความสามารถในการทำซ้ำแบบพกพาข้ามแพลตฟอร์มฉันเขียนรหัส ran1 () จากสูตรตัวเลขใน C, 2nd Edition, WHPress, et al, Cambridge UP 1992, ISBN 0-521-43108-5, หน้า 280 ทำงานได้ดีเท่าที่ ฉันบอกได้ แต่ยังไม่ได้ทดสอบเชิงปริมาณ

ใช้ random () หรือ drand48 () / lrand48 () (ฉันมักจะใช้อันหลังสำหรับการเปลี่ยนแปลงของโมเลกุลและการจำลอง Monte Carlo และมันก็ค่อนข้างดี) นอกจากนี้ลองใช้เมล็ดสุ่ม นี่น่าจะเพียงพอสำหรับการจำลองสมการ Langevin ของอนุภาคเดี่ยว
valerio

เราใช้เส้นรอบวงไม่ใช่วงกลม

@PeterShor ขอบคุณสำหรับการแก้ไข ฉันได้อัปเดตคำตอบแล้วยังไม่มีโชคฉันกลัว
RedPointyJackson

1
@DanielShapero สุ่มและ urandom ควรมีความปลอดภัยในการเข้ารหัส RNG สำหรับวัตถุประสงค์ในการเข้ารหัสเช่นสร้างคีย์ ฮาร์ดแวร์ด้านของมันก็คือบน Linux พวกเขาใช้เอนโทรปีสิ่งแวดล้อมก็ไม่ได้เช่นเดียวกับการเร่งฮาร์ดแวร์ พวกเขาไม่ได้มีไว้สำหรับการจำลอง Monte Carlo เลย
คิริลล์

คำตอบ:


3

การอ้างอิงที่น่าสนใจหนึ่งที่อธิบายถึงความล้มเหลวของการจำลอง Monte Carlo ของระบบทางกายภาพเนื่องจาก RNG ไม่เพียงพอ (แม้ว่าพวกเขาไม่ได้ใช้ LCG) คือ:

A. Ferrenberg และ DP Landau การจำลอง Monte Carlo: ข้อผิดพลาดที่ซ่อนจากเครื่องกำเนิดตัวเลขแบบ "ดี" ตัวอักษรทบทวนทางกายภาพ 63 (23): 3382-3384, 1992

แบบจำลองของ Ising ที่ Ferrenberg และ Landua ศึกษานั้นเป็นการทดสอบที่ดีของ RNG เนื่องจากคุณสามารถเปรียบเทียบกับโซลูชันที่แน่นอน (สำหรับปัญหา 2 มิติ) และค้นหาข้อผิดพลาดในหลัก โมเดลเหล่านี้ควรแสดงข้อบกพร่องใน PMMLCG เลขคณิตแบบ 32 บิตที่ล้าสมัยโดยไม่มีปัญหามากเกินไป

อีกหนึ่งการอ้างอิงที่น่าสนใจคือ:

H. Bauke และ Stephan Mertens เหรียญสุ่มหลอกแสดงหัวมากกว่าก้อย arXiv: cond-mat / 0307138 [cond-mat.stat-mech]

Bauke และ Mertens สร้างความแข็งแกร่งให้กับเครื่องกำเนิดสัญญาณการตอบรับแบบเส้นตรงแบบไบนารี่ Bauke และ Mertens มีเอกสารอื่น ๆ ที่เกี่ยวข้องกับเรื่องนี้

อาจเป็นเรื่องยากที่จะหาเครื่องบิน Marsaglia ในพล็อตกระจายแบบ 3 มิติ คุณสามารถลองหมุนพล็อตเพื่อให้ได้มุมมองที่ดีขึ้นและบางครั้งพวกเขาก็จะโผล่มาหาคุณ คุณยังสามารถทำการทดสอบ 3 มิติของความสม่ำเสมอทางสถิติสำหรับ LCG รุ่น 32 บิตที่เก่ากว่าสิ่งเหล่านี้จะล้มเหลวด้วยจำนวนของถังขยะที่ค่อนข้างน้อย เช่นการทดสอบความสม่ำเสมอด้วยตารางถังขยะขนาด 20x20x20 ใน 3 มิติเพียงพอที่จะตรวจสอบการขาดความสม่ำเสมอสำหรับ PMMLCG ที่ใช้กันอย่างแพร่หลาย (และเป็นที่รู้จักกันดีก่อนหน้านี้) ด้วย m = 2 ^ 31-1, a = 7 ^ 5


1

มันเป็นไปได้ที่จะใช้ชุด TestU01ของการทดสอบ PRNG ในเพื่อที่จะหาที่ของการทดสอบเหล่านั้นrandล้มเหลว (ดูTestU01: AC Library สำหรับการทดสอบเชิงประจักษ์ของเครื่องกำเนิดไฟฟ้าจำนวนสุ่มสำหรับภาพรวมของชุดทดสอบ) นั้นง่ายกว่าการสร้างแบบจำลอง Monte Carlo ด้วยตัวเอง ในอีกแง่หนึ่งมันก็เป็นคำถามของการประพันธ์ซอฟต์แวร์ (และความถูกต้องของซอฟต์แวร์): เนื่องจาก PRNG ที่ดูเหมือนจะทำงานได้ดีในการทดสอบขนาดเล็กและเรียบง่ายคุณจะรู้ได้อย่างไรว่าพฤติกรรมทางพยาธิวิทยาของมันจะไม่ถูกกระตุ้นโดยโปรแกรมขนาดใหญ่

นี่คือรหัส:

#include "TestU01.h"

int main() {
  // Same as rand() on my machine
  unif01_Gen* gen = ulcg_CreateLCG(2147483647, 16807, 0, 12345);

  bbattery_SmallCrush(gen);
  bbattery_Crush(gen);

  return 0;
}

สำหรับชุดSmallCrushมี 3 การทดสอบที่ล้มเหลวจาก 15 รายการ (ดู guidelongtestu01.pdfใน TestU01 สำหรับคำอธิบายแบบยาวและการอ้างอิงทั้งหมดนี่คือ 15 สถิติจากการทดสอบ 10 ครั้ง)

  • n tdtdtI1,{Ij+1Ij}ตามการกระจายที่รู้จักกันโดยประมาณ

  • n t[0,1)tdt hypercubes เท่ากันและนับจำนวนของการชน

  • nt[0,1)XnP(X<x)=xtn=2×106t=6χ2<10300ในขณะที่การทดสอบโฆษณาผ่าน (การทดสอบโฆษณานี้ล้มเหลวในการทดสอบที่คล้ายกันขนาดใหญ่กว่าใน Crush)

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

ดูเหมือนว่าMaxOftจะน่าสงสัยเป็นพิเศษเพราะคำอธิบายนั้นตรงไปตรงมา

ในบรรดาการทดสอบในชุดCrushนั้นrandล้มเหลว 51 จาก 140 (140 สถิติในการทดสอบ 96 ครั้ง) การทดสอบที่ล้มเหลวบางส่วน (เช่นFourier3 ) ทำในสายอักขระบิตดังนั้นอาจเป็นไปได้ว่าอาจไม่เกี่ยวข้องกับคุณ การทดสอบอยากรู้อยากเห็นอีกอย่างที่ล้มเหลวคือGCDซึ่งทดสอบการกระจายของ GCD ของจำนวนเต็มแบบสุ่มสองตัว (อีกครั้งฉันไม่รู้ว่าทำไมการทดสอบนี้โดยเฉพาะล้มเหลวหรือไม่ว่าการจำลองของคุณจะประสบปัญหานี้หรือไม่)

PS : อีกสิ่งหนึ่งที่ควรทราบคือrand()จริง ๆ แล้วช้ากว่า PRNG บางตัวที่ผ่านการทดสอบ SmallCrush , Crush , BigCrushทั้งหมดเช่นMRG32k3a (ดูที่กระดาษ L'Ecuyer & Simard ด้านบน)

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