สร้างตัวเลขสุ่มด้วยตนเอง


30

ฉันจะสร้างตัวเลขสุ่มด้วยตนเองจากการแจกแจงที่กำหนดได้อย่างไรเช่น 10 การรับรู้จากการแจกแจงแบบปกติมาตรฐาน


10
คุณอธิบายได้ไหมว่าทำไมคุณถึงต้องการทำสิ่งนี้และมีข้อ จำกัด อื่น ๆ
mdewey

2
คุณสามารถรับตารางของตัวเลขสุ่ม (rand ใช้ในการเผยแพร่ในหมู่คนอื่น ๆ )
แบทแมน

4
@Batman: ใช่และหนังสือ RAND ที่มีตัวเลขสุ่ม10⁶มีความคิดเห็น 655 รายการใน Amazon คาดการณ์ทั้งหมดแน่นอน
ซีอาน

10
(ฉันประหลาดใจที่ไม่มีใครได้แสดงความคิดเห็นก่อนหน้านี้) เว้นแต่จะเป็นเรื่องสำคัญอย่างยิ่งที่ไม่ควรพยายามใช้การปรับใช้แบบกำหนดเองเพื่อสร้างตัวเลขสุ่ม ใช่มันเป็นเรื่องดีที่จะรู้ว่าต้องทำอย่างไรและอาจเป็นสิ่งแรกที่คุณจะแสดงในคลาส " วิธีการ MC " (และนั่นยอดเยี่ยมมาก!) แต่อย่าทำในโครงการชีวิตจริง มีรูทีนการสร้างหมายเลขสุ่มแบบพิเศษด้วยเหตุผลการใช้อัลกอริธึมหลักตั้งแต่เริ่มต้นคือการเสียเวลาแหล่งที่มาของข้อบกพร่องและความพยายามในการรับรู้ข้อมูลที่ไม่ดี
usεr11852พูดว่า Reinstate Monic

2
@ ซีอาน: ใช่ฉันยอมรับว่าเป็นข้อสันนิษฐานที่ปลอดภัย ดังที่ได้กล่าวมานี้เป็นเพียงความคิดเห็นเพื่อเตือนผู้ใช้ RNG ของตัวเองโดยไม่ทราบว่าการออกแบบ RNG เป็นธุรกิจที่จริงจังมาก เพื่ออ้างอิงฟอนนอยมันน์ : "ผู้ใดก็ตามที่คิดว่าวิธีการเกี่ยวกับเลขคณิตของการสร้างเลขสุ่มคือแน่นอนอยู่ในสภาพบาป"
usεr11852พูดว่า Reinstate Monic

คำตอบ:


46

หาก "ด้วยตนเอง" รวมถึง "เชิงกล" แสดงว่าคุณมีตัวเลือกมากมายสำหรับคุณ ในการจำลองตัวแปร Bernoulli โดยมีความน่าจะเป็นครึ่งหนึ่งเราสามารถโยนเหรียญ: สำหรับก้อย1สำหรับหัว ในการจำลองการแจกแจงเชิงเรขาคณิตเราสามารถนับจำนวนเหรียญที่ต้องโยนก่อนที่เราจะได้หัว เพื่อจำลองการกระจายตัวแบบทวินามเราสามารถโยนเหรียญของเราnครั้ง (หรือเพียงแค่โยนเหรียญn ) และนับจำนวนหัว "quincunx" หรือ "เครื่องถั่ว" หรือ "กล่อง Galton"01nn ? ดูเหมือนว่าไม่มีสิ่งเช่น "เหรียญถ่วงน้ำหนัก"แต่ถ้าเราต้องการเปลี่ยนแปลงพารามิเตอร์ความน่าจะเป็นของตัวแปร Bernoulli หรือ binomial ของเราเป็นค่าอื่นที่ไม่ใช่เข็มของGeorges-Louis Leclerc, Comte de Buffonจะช่วยให้เราทำเช่นนั้นได้ ในการจำลองการกระจายตัวแบบไม่ต่อเนื่องใน{ 1 , 2 , 3 , 4 , 5 , 6 }เราจะทำการหมุนแม่พิมพ์แบบหกด้าน แฟน ๆ ของเกมสวมบทบาทจะได้พบกับลูกเต๋าที่แปลกใหม่มากขึ้นเช่นลูกเต๋าเตตราดาร์ดเพื่อสุ่มตัวอย่างจาก{ 1 , 2 , 3 , 4 }p=0.5{1,2,3,4,5,6}{1,2,3,4}ในขณะที่วงล้อสปินเนอร์หรือรูเล็ตสามารถไปต่อได้ ( เครดิตรูปภาพ )

ความหลากหลายของลูกเต๋า

เราจะต้องคลั่งไคล้ที่จะสร้างตัวเลขสุ่มในลักษณะนี้ในวันนี้เมื่อมันเป็นเพียงคำสั่งเดียวบนคอนโซลคอมพิวเตอร์ - หรือถ้าเรามีตารางตัวเลขสุ่มที่เหมาะสมใช้ได้หนึ่งไปยังมุม dustier ของชั้นหนังสือ? บางทีอาจจะมีบางสิ่งที่น่าสัมผัสเกี่ยวกับการทดลองทางกายภาพ แต่สำหรับคนที่ทำงานก่อน Computer Age จริง ๆ แล้วก่อนที่จะมีตารางจำนวนสุ่มขนาดใหญ่ (ซึ่งมีมากขึ้นในภายหลัง) การจำลองตัวแปรสุ่มด้วยตนเองมีความสำคัญในทางปฏิบัติมากขึ้น เมื่อ Buffon ตรวจสอบความขัดแย้งของSt. Petersburg- เกมโยนเหรียญที่มีชื่อเสียงซึ่งจำนวนผู้เล่นชนะเป็นสองเท่าทุกครั้งที่มีการโยนหัวผู้เล่นแพ้หางแรกและคาดว่าการจ่ายเงินจะกลับมาอย่างไม่มีที่สิ้นสุด - เขาต้องการจำลองการกระจายทางเรขาคณิตด้วยp=0.5 0.5ในการทำเช่นนั้นดูเหมือนว่าเขาจ้างเด็กคนหนึ่งโยนเหรียญเพื่อจำลองเกมเซนต์ปีเตอร์สเบิร์ก 2048 บทละครโดยบันทึกจำนวนการโยนก่อนที่เกมจะจบลง การกระจายทางเรขาคณิตจำลองนี้ทำซ้ำในStigler (1991) :

Tosses Frequency
1      1061
2      494
3      232
4      137
5      56
6      29
7      25
8      8
9      6

ในเรียงความเดียวกันกับที่เขาตีพิมพ์การสอบสวนเชิงประจักษ์ในความขัดแย้งของเซนต์ปีเตอร์สเบิร์ก Buffon ได้แนะนำ " เข็มควายของเข็ม " ที่โด่งดัง ถ้าเครื่องบินจะถูกแบ่งออกเป็นเส้นโดยเส้นคู่ขนานระยะทางต่างหากและเข็มยาวL dจะลดลงบนมันน่าจะเป็นเข็มข้ามหนึ่งในสายเป็น2 ลิตรdล.d d2ล.πd

การทดลองเข็มของ Buffon

ดังนั้นเข็มของ Buffon จึงสามารถใช้เพื่อจำลองตัวแปรสุ่มหรือXBinomial(n,2lX~Bernoulli(2ล.πd)และเราสามารถปรับความน่าจะเป็นของความสำเร็จโดยการเปลี่ยนความยาวของเข็มของเราหรือ (อาจจะสะดวกกว่า) ระยะทางที่เราใช้ควบคุมเส้น การใช้งานที่ทางเลือกของเข็ม Buffon คือเป็นวิธีที่ไม่มีประสิทธิภาพน่าขนพองสยองเกล้าที่จะหาการประมาณความน่าจะเป็นสำหรับπ ภาพ (เครดิต) แสดงไม้ขีดไฟ 17 อันโดยมี 11 เส้น เมื่อระยะห่างระหว่างเส้นปกครองถูกตั้งค่าเท่ากับความยาวของแท่งไม้ขีดไฟเช่นที่นี่สัดส่วนที่คาดหวังของไม้ขีดไฟข้ามคือ2X~มีสองจำนวน(n,2ล.πd)πและด้วยเหตุนี้เราสามารถประมาณ πเป็นครั้งที่สองซึ่งกันและกันของส่วนสังเกต: ที่นี่เราได้รับ π =2172ππ^3.1 ในปี 1901 มาริโอ Lazzarini อ้างว่าได้ดำเนินการทดลองโดยใช้ 2.5 ซม. เข็มที่มีเส้น 3 ซม. ออกจากกันและหลังจากที่ได้รับ 3408 กลมๆ π =355π^=217113.1 . นี่คือเหตุผลที่รู้จักกันดีถึงπ, แม่นยำถึงทศนิยมหกตำแหน่ง Badger (1994) แสดงหลักฐานที่น่าเชื่อถือว่านี่เป็นการฉ้อโกงไม่น้อยกว่า 95% ของความแม่นยำทศนิยมหกตำแหน่งโดยใช้เครื่องมือของ Lazzarini ต้องใช้ความอดทน 134 ล้านล้านเข็ม! แน่นอนเข็ม Buffon เป็นประโยชน์มากขึ้นเป็นเครื่องกำเนิดไฟฟ้าจำนวนสุ่มกว่าก็คือเป็นวิธีการสำหรับการประเมินππ^=355113ππ


เครื่องกำเนิดไฟฟ้าของเราจนถึงตอนนี้ได้แยกกันอย่างน่าผิดหวัง ถ้าเราต้องการจำลองการแจกแจงแบบปกติ? ทางเลือกหนึ่งคือการได้รับตัวเลขสุ่มและใช้พวกเขาในการประมาณค่าแบบไม่ต่อเนื่องที่ดีกับการแจกแจงแบบสม่ำเสมอในจากนั้นทำการคำนวณบางอย่างเพื่อแปลงให้เป็นค่าเบี่ยงเบนปกติแบบสุ่ม ล้อสปินเนอร์หรือรูเล็ตสามารถให้ตัวเลขทศนิยมจากศูนย์ถึงเก้า ลูกเต๋าสามารถสร้างเลขฐานสอง ถ้าทักษะทางคณิตศาสตร์ของเราสามารถรับมือกับฐานที่น่ากลัวได้แม้แต่ชุดลูกเต๋ามาตรฐานก็ยังทำได้ คำตอบอื่น ๆ ได้กล่าวถึงวิธีการแปลงรูปแบบนี้อย่างละเอียด ฉันขอเลื่อนการอภิปรายเพิ่มเติมใด ๆ จนกว่าจะสิ้นสุด[0,1]

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

นักสถิติชาวอเมริกันที่น่าทึ่งErastus Lyman De Forestสนใจที่จะทำให้ตารางชีวิตราบรื่นและพบปัญหาที่ต้องจำลองค่าสัมบูรณ์ของส่วนเบี่ยงเบนปกติ ในสิ่งที่จะพิสูจน์ได้ว่าเป็นรูปแบบการทำงาน De Forest ถูกจริงๆสุ่มตัวอย่างจากการกระจายครึ่งปกติ ยิ่งกว่านั้นแทนที่จะใช้ค่าเบี่ยงเบนมาตรฐานของหนึ่ง ( Z~ยังไม่มีข้อความ(0,12)เราถูกเรียกว่า "มาตรฐาน") De Forest ต้องการ "ข้อผิดพลาดที่น่าจะเป็น" (ค่าเบี่ยงเบนเฉลี่ย) ของหนึ่ง นี่คือรูปแบบที่กำหนดในตารางของ "ความน่าจะเป็นของข้อผิดพลาด"ในภาคผนวกของ "คู่มือดาราศาสตร์และเชิงปฏิบัติทรงกลมเล่ม 2" โดยวิลเลียม Chauvenet จากตารางนี้ De Forest แก้ไขปริมาณของการแจกแจงครึ่งปกติจากถึงp = 0.995ซึ่งเขาถือว่าเป็น "ข้อผิดพลาดของความถี่เท่ากัน"พี=0.005พี=0.995

ตาราง De Forest ของข้อผิดพลาดของความถี่ที่เท่ากัน

หากคุณต้องการจำลองการแจกแจงแบบปกติตาม De Forest คุณสามารถพิมพ์ตารางนี้และตัดมันได้ เดอฟอเรสต์ (2419) เขียนว่าข้อผิดพลาด "ได้รับการจารึกไว้บนแผ่นกระดานขนาดเท่ากัน 100 บิตซึ่งถูกเขย่าในกล่องและดึงออกมาทีละตัว"

นักดาราศาสตร์และนักอุตุนิยมวิทยาเซอร์จอร์จโฮเวิร์ดดาร์วิน (บุตรชายของนักธรรมชาตินิยมชาร์ลส์) ต่างปั่นป่วนพัฒนาสิ่งต่าง ๆ โดยการพัฒนาสิ่งที่เขาเรียกว่า "รูเล็ต" เพื่อสร้างความเบี่ยงเบนปกติแบบสุ่ม ดาร์วิน (1877)อธิบายวิธี:

x720π0xอี-x2dx+-+-

"ดัชนี" ควรอ่านได้ที่นี่ในฐานะ "ตัวชี้" หรือ "ตัวบ่งชี้" (cf "นิ้วชี้") สติกเลอร์ชี้ให้เห็นว่าดาร์วินเช่นเดอฟอเรสต์ใช้การแจกแจงสะสมแบบครึ่งปกติรอบดิสก์ จากนั้นใช้เหรียญเพื่อแนบเครื่องหมายที่สุ่มทำให้การแจกแจงแบบปกติเต็มรูปแบบ Stigler ตั้งข้อสังเกตว่ามันไม่ชัดเจนว่าขนาดนั้นจบการศึกษาอย่างไร แต่ทึกทักเอาว่าคำสั่งให้จับดิสก์กลาง - หมุนด้วยตนเองคือ "เพื่อลดอคติที่อาจเกิดขึ้นต่อส่วนหนึ่งของดิสก์และเพื่อเร่งกระบวนการ"

เซอร์ฟรานซิสกัลตันบังเอิญครึ่งลูกพี่ลูกน้องกับชาร์ลส์ดาร์วินได้ถูกกล่าวถึงในควินน์ ในขณะที่กลไกนี้จำลองการแจกแจงทวินามว่าโดยทฤษฎีบท De Moivre-Laplace นั้นมีความคล้ายคลึงกับการแจกแจงแบบปกติ (และบางครั้งใช้เป็นเครื่องช่วยสอนสำหรับหัวข้อนั้น) Galton ได้สร้างแผนการที่ซับซ้อนมากขึ้นเมื่อเขาต้องการ ตัวอย่างจากการแจกแจงแบบปกติ ยิ่งไปกว่าความแปลกใหม่ของตัวอย่างที่ไม่เป็นทางการที่ด้านบนของคำตอบนี้ Galton พัฒนาลูกเต๋ากระจายตามปกติ- หรือมากกว่าอย่างแม่นยำคือชุดลูกเต๋าที่สร้างการกระจายแบบไม่ต่อเนื่องที่ยอดเยี่ยมสำหรับการแจกแจงแบบปกติโดยมีค่าเบี่ยงเบนมัธยฐานหนึ่ง ลูกเต๋าเหล่านี้สร้างขึ้นในปี 1890 ถูกเก็บรักษาไว้ในคอลเล็กชัน Galton ที่ University College London

Galton ลูกเต๋าปกติ

ในบทความ 1890 ในNature Galton เขียนว่า:

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

+-114นิ้วและวางด้วยกระดาษสีขาวบาง ๆ สำหรับการทำเครื่องหมายที่จะเขียนบน Galton แนะนำให้เตรียมลูกเต๋าชนิดที่สามสามอัน II และ II หนึ่งในสาม

การออกแบบลูกเต๋า Galton ปกติ

Raazesh Sainudiin ของห้องปฏิบัติการสำหรับการทดสอบทางสถิติคณิตศาสตร์รวมถึงโครงการนักศึกษาจาก University of Canterbury, NZ, ทำซ้ำลูกเต๋า Galton ของ โครงการรวมถึงการตรวจสอบเชิงประจักษ์จากการทอยลูกเต๋าหลายครั้ง (รวมถึง CDF เชิงประจักษ์ที่ดูมั่นใจ "ปกติ") และการปรับคะแนนลูกเต๋าเพื่อให้พวกเขาปฏิบัติตามการแจกแจงแบบปกติมาตรฐาน ใช้คะแนนดั้งเดิมของ Galton นอกจากนี้ยังมีกราฟของการแจกแจงแบบปกติ discretized ที่คะแนนลูกเต๋าตาม

Galton ลูกเต๋ากระจายไม่ต่อเนื่อง


หากคุณพร้อมที่จะขยาย "กลไก" ไปยังเครื่องใช้ไฟฟ้าโปรดสังเกตว่ามหากาพย์ล้านล้าน A RAND แบบสุ่มพร้อม 100,000 Deviates ปกติขึ้นอยู่กับการจำลองทางอิเล็กทรอนิกส์ของวงล้อรูเล็ต จากรายงานทางเทคนิค (โดย George W. Brown เดิมทีมิถุนายน 1949) เราพบ:

ด้วยเหตุนี้ผู้คน RAND จึงได้รับความช่วยเหลือจากบุคลากรด้านวิศวกรรมของ บริษัท Douglas Aircraft ได้ออกแบบล้อรูเล็ตอิเล็คทรอนิคส์ตามรูปแบบของข้อเสนอที่เซซิลเฮสติ้งส์เสนอ สำหรับวัตถุประสงค์ของการพูดคุยนี้คำอธิบายสั้น ๆ จะเพียงพอ แหล่งกำเนิดความถี่คลื่นความถี่แบบสุ่มนั้นถูกรวบรวมด้วยพัลส์ความถี่คงที่ประมาณหนึ่งครั้งต่อวินาทีโดยเฉลี่ยประมาณ 100,000 ครั้งต่อวินาที วงจรกำหนดมาตรฐานพัลส์ส่งพัลส์ไปยังตัวนับเลขฐานสองห้าตำแหน่งดังนั้นโดยหลักการแล้วเครื่องจะเหมือนกับวงล้อรูเล็ตที่มี 32 ตำแหน่งทำให้โดยเฉลี่ยประมาณ 3,000 รอบการหมุนแต่ละรอบ การแปลงแบบไบนารี่เป็นทศนิยมถูกใช้ไปโดยทิ้งตำแหน่ง 12 จาก 32 ตำแหน่งและตัวเลขสุ่มที่ได้จะถูกป้อนเข้าสู่การชกของไอบีเอ็มเพื่อให้ได้ตารางการชกของการ์ดแบบสุ่ม

อย่างไรก็ตามก่อนที่คุณจะถูกล่อลวงให้ประกอบล้อรูเล็ตอิเล็คโทรนิคคุณควรอ่านส่วนที่เหลือของรายงาน! มันปรากฏว่าโครงการ "พึ่งพาอย่างหนักกับสมมติฐานของมาตรฐานชีพจรในอุดมคติที่จะเอาชนะการตั้งค่าตามธรรมชาติในตำแหน่งเคาน์เตอร์; ประสบการณ์ในภายหลังแสดงให้เห็นว่าข้อสันนิษฐานนี้เป็นจุดอ่อน จุดนี้ " การวิเคราะห์ทางสถิติโดยละเอียดพบปัญหาบางประการกับผลลัพธ์χ2การทดสอบความถี่ของเลขคี่และเลขคู่พบว่าบางรุ่นมีความไม่สมดุลเล็กน้อย นี่เป็นเรื่องเลวร้ายในบางกลุ่มมากกว่าคนอื่น ๆ แนะนำว่า "เครื่องทำงานในเดือนที่แล้วนับตั้งแต่ปรับขึ้น ... สิ่งบ่งชี้ที่เครื่องนี้ต้องการการบำรุงรักษาที่มากเกินไปเพื่อให้มันอยู่ในรูปทรงสุดยอด" อย่างไรก็ตามพบวิธีการทางสถิติในการแก้ไขปัญหาเหล่านี้:

ณ จุดนี้เรามีตัวเลขล้านหลักดั้งเดิม, การ์ด IBM 20,000 ใบ, มี 50 หลักในการ์ด, โดยมีอคติแปลก ๆ แม้เล็กน้อยที่สังเกตได้จากการวิเคราะห์ทางสถิติ ตอนนี้ได้ตัดสินใจที่จะสุ่มตารางใหม่หรืออย่างน้อยก็เปลี่ยนมันโดยการเล่นรูเล็ตเล็ก ๆ เพื่อลบอคติคี่ - คู่ เราได้เพิ่ม (mod 10) หลักในแต่ละบัตรหลักโดยหลักไปยังตัวเลขที่สอดคล้องกันของบัตรก่อนหน้านี้ ตารางที่ได้รับหนึ่งล้านหลักนั้นจะต้องผ่านการทดสอบมาตรฐานต่างๆการทดสอบความถี่การทดสอบแบบอนุกรมการทดสอบโป๊กเกอร์เป็นต้นตัวเลขล้านเหล่านี้มีค่าใช้จ่ายด้านสุขภาพที่สะอาดและได้รับการรับรองเป็นตารางสุ่มตัวเลขแบบสุ่มของ RAND

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

แน่นอนว่าสิ่งนี้เกี่ยวข้องกับการสร้างตัวเลขทศนิยมแบบสุ่มแต่ง่ายต่อการใช้สิ่งเหล่านี้ในการสร้างค่าเบี่ยงเบนแบบสุ่มที่สุ่มมาอย่างสม่ำเสมอ[0,1]ถูกปัดเศษเป็นทศนิยมหลายตำแหน่งที่คุณเห็นว่าเหมาะสมที่จะใช้เป็นหลัก มีวิธีการที่น่ารักต่างๆเพื่อสร้างความเบี่ยงเบนของการกระจายอื่น ๆ จากการเบี่ยงเบนเครื่องแบบของคุณอาจจะเป็นความสุนทรีย์มากที่สุดที่ชื่นชอบซึ่งเป็นอัลกอริทึมรัตมาสำหรับการแจกแจงความน่าจะเป็นที่เดียวทั้งลดลงหรือสมมาตร unimodal แต่แนวคิดที่ง่ายที่สุดและมากที่สุดในบังคับกันอย่างแพร่หลายเป็นสิ่งที่ตรงกันข้าม การแปลง CDF : กำหนดค่าเบี่ยงเบนยู จากการกระจายเครื่องแบบบน [0,1]และถ้าการกระจายที่คุณต้องการมี CDF Fจากนั้น F-1(ยู)จะเป็นการเบี่ยงเบนแบบสุ่มจากการกระจายของคุณ หากคุณมีความสนใจเป็นพิเศษในการเบี่ยงเบนปกติแบบสุ่มการคำนวณการแปลงBox-Mullerมีประสิทธิภาพมากกว่าการสุ่มตัวอย่างการแปลงผกผันวิธี Marsaglia ขั้วโลกมีประสิทธิภาพมากกว่าอีกครั้งและ ziggurat ( เครดิตรูปภาพสำหรับภาพเคลื่อนไหวด้านล่าง ) ยิ่งดีกว่า ปัญหาในทางปฏิบัติบางอย่างจะกล่าวถึงในหัวข้อ StackOverflow นี้หากคุณตั้งใจจะใช้วิธีการเหล่านี้อย่างน้อยหนึ่งวิธีในรหัส

ซิกแซ็กสำหรับครึ่งปกติ

อ้างอิง


(* * * *)ในวารสารเดียวกันนี้คือเทคนิคต่าง ๆ ที่ใช้กระดาษที่มีการอ้างถึงอย่างสูงของ von Neumann ซึ่งใช้ในการเชื่อมต่อกับ Random Digitsซึ่งเขาพิจารณาถึงความยากลำบากในการสร้างตัวเลขสุ่มเพื่อใช้ในคอมพิวเตอร์ เขาปฏิเสธความคิดของอุปกรณ์ทางกายภาพที่แนบมากับเครื่องคอมพิวเตอร์ที่สร้างการป้อนข้อมูลแบบสุ่มในการบินที่และคิดว่าไม่ว่าจะเป็นกลไกทางกายภาพอาจจะใช้ในการสร้างตัวเลขสุ่มที่มีการบันทึกไว้แล้วสำหรับการใช้งานในอนาคต - หลักสิ่งที่แรนด์ได้ทำกับพวกเขาล้านตัวเลข . นอกจากนี้ยังรวมการอ้างอิงที่มีชื่อเสียงของเขาเกี่ยวกับสิ่งที่เราจะอธิบายว่าเป็นความแตกต่างระหว่างการสร้างตัวเลขสุ่มและหลอก:"ผู้ใดก็ตามที่พิจารณาวิธีการทางคณิตศาสตร์ในการสร้างเลขสุ่มคือแน่นอนว่าอยู่ในสภาพบาปสำหรับตามที่ได้ชี้ให้เห็นหลายครั้งไม่มีสิ่งใดที่เป็นเลขสุ่ม - มีเพียงวิธีที่จะสร้างตัวเลขสุ่ม และขั้นตอนการคำนวณทางคณิตศาสตร์ที่เข้มงวดของหลักสูตรไม่ใช่วิธีการดังกล่าว "


5
คุณจะต้องล้อเล่น ... ( แต่ใช่ว่าจริงๆด้วยตนเอง +1)
nalzok

8
งานนี้ใส่มากแค่ไหน!
Richard Hardy

3
โปรดสังเกตว่าลูกเต๋าที่ไม่เป็นมาตรฐานอาจไม่ยุติธรรมดังนั้นจึงเป็นการดีที่จะทดสอบพวกเขาก่อนเช่นyoutube.com/watch?v=VI3N4Qg-JZM
ทิม

2
@RichardHardy Paradox ในความเป็นจริงมันง่ายกว่าที่ฉันจะได้รับทุกสิ่งที่เขียนลงไปในขณะที่มันอยู่ข้างหน้าฉันและอย่างน้อยก็ติดอยู่ในความทรงจำของฉันชั่วคราว
Silverfish

2
ไม่ว่าในกรณีใดฉันพบว่ามันน่าประทับใจ!
Richard Hardy

44

If you can get access to a very precise clock, you can extract the decimal part of the current time and turn it into a uniform, from which you can derive a normal simulation by the Box-Müller transform:

X=2logU1cos(2πU2)
(and even two since Y=2logU1sin(2πU2) is another normal variate independent from X).

For instance, on my Linux OS, I can check

$ date +%s.%N
1479733744.077762986
$ date +%s.%N
1479733980.615056616

hence set

U1=.077762986, U2=.615056616
and X as
> sqrt(-2*log(.077762986))*cos(2*pi*.615056616)
[1] -1.694815

ภาคผนวก:เนื่องจากการคำนวณลอการิทึมและโคไซน์อาจไม่ถือว่าเป็น คู่มือเพียงพอมีตัวแปรของ Box-Müllerที่หลีกเลี่ยงการใช้ฟังก์ชันยอดเยี่ยมเหล่านั้น (ดูการออกกำลังกาย 2.9 ในวิธีการทางสถิติ Monte Carloหนังสือของเรา ):

ตัวแปรของ Box-Muller

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

ป้อนคำอธิบายรูปภาพที่นี่

เป็นที่ยอมรับว่ามันต้องการการคำนวณ 1 / e แต่เพียงครั้งเดียว

If you do not have access to this clock, you can replace this uniform generator by a mechanistic uniform generator, like throwing a dart on a surface with a large number of unit squares (0,1)2 or rolling a ball on a unit interval (0,1) with enough bounces [as in Thomas Bayes' conceptual billiard experiment] or yet throwing matches on a wooden floor with unit width planks and counting the distance to the nearest leftmost separation [as in Buffon's experiment] or yet further to start a roulette wheel with number 1 the lowest and turn the resulting angle of 1 with its starting orientation into a uniform (0,2π) draw.

การใช้ CLTเพื่อประมาณค่าปกตินั้นไม่ใช่วิธีที่ฉันจะแนะนำในขณะที่ (1) คุณยังต้องการตัวแปรอื่น ๆ เพื่อป้อนค่าเฉลี่ยดังนั้นอาจใช้เครื่องแบบในอัลกอริทึม Box-Müllerและ (2) ความแม่นยำเพิ่มขึ้นค่อนข้างมาก ช้าด้วยจำนวนของการจำลอง โดยเฉพาะอย่างยิ่งถ้าใช้ตัวแปรสุ่มต่อเนื่องเช่นผลของลูกเต๋าที่แม้จะมีมากขึ้นกว่าหกใบหน้า อ้างจากโทมัสและคณะ (2007)การสำรวจข้อดีและข้อเสียของเครื่องกำเนิดไฟฟ้าสุ่มแบบเกาส์:

แน่นอนว่าทฤษฎีบทขีด จำกัด กลางเป็นตัวอย่างของวิธี“ ประมาณ” - แม้ว่าจะใช้การคำนวณทางคณิตศาสตร์ที่สมบูรณ์แบบก็ตามสำหรับ K ที่มีค่า จำกัด เอาท์พุทจะไม่เป็นเกาส์เซียน

นี่คือการทดลองที่รวดเร็วเพื่อแสดงให้เห็นถึงปัญหา: ฉันสร้าง 100 ครั้งโดยเฉลี่ยของผลลัพธ์ 30 รายการ:

dies=apply(matrix(sample(1:6,30*100,rep=TRUE),ncol=30),1,mean)

จากนั้นปรับค่าเฉลี่ยเหล่านั้นให้เป็นค่าศูนย์ - ผลต่างหนึ่งตัวแปร

stdies=(dies-3.5)/sqrt(35/12/30)

และดูที่แบบปกติ [หรือขาดมัน] ของตัวอย่างนี้:

qqnorm (stdies เทือกเขา = "gold2" PCH = 19); abline (ก = 0, B = 1, เทือกเขา = "SteelBlue" LWD = 2 lty = 2)

ครั้งแรกความพอดีไม่ดีโดยเฉพาะอย่างยิ่งในหางและที่สองค่อนข้างชัดเจนภาพยืนยันว่าจำนวนค่าที่ถ่ายโดยกลุ่มตัวอย่างมีขอบเขตที่น่าอาย (ในการทดลองนี้โดยเฉพาะมีเพียง 34 ค่าที่แตกต่างกันที่ดำเนินการโดยdiesระหว่าง76/30และ122/30.) โดยการเปรียบเทียบถ้าฉันใช้ประโยชน์จากผลลัพธ์ของการตาย 3000 เดียวกันDผม เพื่อสร้างตัวเลขของเครื่องแบบเทียมเทียมให้เพียงพอ

ยู=Σผม=1kDผม-16ผม
กับ k=15 (โปรดสังเกตว่า6¹⁵> 10¹¹ดังนั้นฉันสร้างตัวเลขสุ่มมากกว่า 11 หลัก) จากนั้นให้ใช้การแปลง Box-Müllerด้านบนเพื่อเปลี่ยนเครื่องแบบคู่ให้เป็นคู่ของตัวแปร N (0,1)
dies=matrix(apply(matrix(sample(0:5,15*200,rep=TRUE),nrow=15)/6^(1:15),2,sum),ncol=2) 
norma=sqrt(-2*log(dies[,1]))*c(cos(2*pi*dies[,2]),sin(2*pi*dies[,2]))

ความพอดีเป็นสิ่งที่ดีเท่าที่ควรจะเป็นสำหรับตัวอย่างขนาด 200 ปกติ (แค่พล็อตอีกอันสำหรับตัวอย่างปกติจริงnorma=rnorm(100)):

ป้อนคำอธิบายรูปภาพที่นี่

ตามที่แสดงเพิ่มเติมโดยการทดสอบ Kolmogorov-Smirnov:

> ks.test(norma,pnorm)

        One-sample Kolmogorov-Smirnov test

data:  norma
D = 0.06439, p-value = 0.3783
alternative hypothesis: two-sided

3

นี่ไม่ใช่การสุ่มอย่างแน่นอนแต่ควรอยู่ใกล้พอเนื่องจากคุณต้องการทดลองแบบคร่าวๆ

ใช้โทรศัพท์ของคุณเพื่อตั้งค่าเที่ยงตรง หลังจากผ่านไป 10 วินาทีให้หยุดมัน (ยิ่งคุณรอมากเท่าไหร่คุณก็ยิ่งจะได้ผลลัพธ์ที่ "สุ่ม" อย่างแท้จริง แต่ 10 วินาทีก็โอเค) ใช้ตัวเลขสุดท้าย (เช่น 10.67 วินาทีจะให้ 67) ใช้ตารางเปอร์เซนต์สำหรับการแจกแจงแบบปกติ ในตัวอย่างนี้คุณเพียงแค่ต้องค้นหา 0.67 และคุณจะพบจำนวน ในกรณีนี้ค่าของคุณประมาณ 0.45 นี่ไม่แม่นยำอย่างสมบูรณ์ แต่จะให้การประมาณที่มั่นคง

หากคุณหมุนต่ำกว่า 50 เพียงทำ 100- [ผลของคุณ] และใช้ตาราง ผลลัพธ์ของคุณจะเหมือนกันโดยมีเครื่องหมายลบเนื่องจากการแสดงสัญลักษณ์ N (0,1)


3

ให้เราพลิกเหรียญที่ไม่เอนเอียง nครั้ง เริ่มต้นที่ศูนย์เรานับ+1 ถ้าหัว -1ถ้าหาง หลังจากn เหรียญพลิกเราหารเคาน์เตอร์ด้วย n. การใช้ทฤษฎีขีด จำกัด กลางถ้าn มีขนาดใหญ่พอสมควรจากนั้นเราควรจะมี "การประมาณค่าโดยประมาณ" ของเกาส์แบบปกติ ยังไม่มีข้อความ(0,1).


ทำไม? ปล่อย

Xk={+1 ถ้า k- เหรียญพลิกเป็นหัว-1 ถ้า k- เหรียญพลิกเป็นก้อย

เป็น iid Bernoulli ตัวแปรสุ่มด้วย P(Xk=±1)=12. ดังนั้น

E(Xk)=0var(Xk)=1

ปล่อย Y=X1+X2++Xn. ดังนั้น

E(Y)=0var(Y)=n

normalizing,

Z=Yn

เราได้รับตัวแปรสุ่มพร้อมความแปรปรวนของหน่วย

E(Z)=0var(Z)=1

1
ตามที่กล่าวไว้ในคำตอบของฉันฉันกลัวว่า CLT จะไม่ใช้การสุ่มในการโยนเหรียญอย่างมีประสิทธิภาพ: พวกมันจะถูกใช้ประโยชน์เป็นเลขฐานสองของ U แบบสุ่มหลอก (0,1) ที่แปรผันได้ง่ายหรือมีความแม่นยำสองเท่า
ซีอาน

@ ซีอานฉันอ่านคำตอบของคุณก่อนโพสต์ของฉันและการคัดค้านของคุณไปยัง CLT ดูเหมือนจะขึ้นอยู่กับการบรรจบกันช้า ตั้งแต่นี้เป็นการทดลองทางความคิดการพลิกเหรียญ 10,000 ล้านครั้งไม่เสียค่าใช้จ่ายใด ๆ และเป็นขั้นตอนแบบแมนนวลที่ไม่ต้องใช้คอมพิวเตอร์ไม่มีการคำนวณลอการิทึมรากที่สองหรือโคไซน์ แน่นอนว่าเราสามารถใช้กฎสไลด์ได้ แต่อาจไปไกลเกินไป
Rodrigo de Azevedo

1
:}}: 10,000 เหรียญพลิกไม่ได้เสียงคู่มือมากสำหรับฉัน ... !
ซีอาน

คู่มือ = ด้วยมือ การคำนวณลอการิทึมและโคไซน์ด้วยมือก็ต้องใช้เวลาเช่นกัน
Rodrigo de Azevedo

0

เป็นที่น่าสังเกตว่าเมื่อคุณสามารถสร้างเครื่องแบบ (0,1) คุณสามารถสร้างตัวแปรสุ่มใด ๆ ที่สามารถคำนวณค่าผกผัน cdf ได้โดยเพียงแค่เสียบตัวแปรสุ่มชุดเข้าไปใน inverse CDF

ดังนั้นหนึ่งอาจคำนวณเครื่องแบบ (0,1) ด้วยตนเองได้อย่างไร อย่างที่ @Silverfish พูดถึงมีหลากหลายลูกเต๋าที่ใช้โดยผู้เล่น RPG แบบดั้งเดิม หนึ่งในนั้นคือตายสิบด้าน สมมติว่านี่เป็นดายที่ยุติธรรมตอนนี้เราสามารถสร้างชุดแยก (0, 9)

นอกจากนี้เรายังสามารถใช้ชุดนี้ (0,9) เพื่อแสดงตัวเลขหลักเดียวของตัวแปรสุ่ม ดังนั้นถ้าเราใช้ลูกเต๋าสองลูกเราจะได้ตัวแปรสุ่มแบบสม่ำเสมอที่สามารถหาค่าได้0.01,0.02,...,0.99,1.00. ด้วยสามลูกเต๋าเราจะได้การแจกแจงแบบสม่ำเสมอ0.001,0.002,...,0.999,1.000.

ดังนั้นเราสามารถเข้าใกล้เครื่องแบบต่อเนื่อง (0,1) โดยการประมาณมันด้วยการกระจายเครื่องแบบที่ไม่ต่อเนื่อง gridded อย่างประณีตด้วยลูกเต๋า 10 ด้าน สิ่งนี้สามารถเสียบเข้ากับ CDF ผกผันเพื่อสร้างตัวแปรสุ่มที่น่าสนใจ

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