อะไรคือเมล็ดพันธุ์ในเครื่องกำเนิดเลขสุ่ม?


21

ฉันลองใช้การค้นหา google ตามปกติ แต่คำตอบส่วนใหญ่ที่ฉันพบนั้นค่อนข้างคลุมเครือหรือเฉพาะภาษา / ห้องสมุดเช่น Python หรือ C ++ stdlib.hเป็นต้นฉันกำลังมองหาผู้ไม่เชื่อเรื่องภาษาคำตอบทางคณิตศาสตร์ไม่ใช่เฉพาะของห้องสมุด

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

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


7
ผมไม่รู้สึกว่ามีคุณสมบัติเหมาะสมที่จะเขียนคำตอบ แต่คุณอาจพบบทความวิกิพีเดียในMersenne Twister enlightening โดยเฉพาะส่วนที่เกี่ยวกับการเริ่มต้น ในระยะสั้นเครื่องกำเนิดตัวเลขเทียมแบบสุ่มเช่น Mersenne Twister ในที่สุดก็จะทำซ้ำเอาท์พุทของมัน 2^19937 − 1ในกรณีของมอนแทนาที่ช่วงเวลาที่มีความยาว เมล็ดนั้นเป็นจุดลำดับที่ยาวมากซึ่งเครื่องกำเนิดไฟฟ้าสตาร์ท ใช่แล้วมันถูกกำหนดไว้แล้ว
IonicSolutions

1
ตัวสร้างตัวเลขสุ่มหลอกเป็นรายการคงที่ซ้ำของตัวเลขที่ไม่มีที่สิ้นสุด มันเริ่มที่ไหน คุณได้รับการพูด
whuber

2
@ คนที่ฉันคิดว่าความคิดเห็นของคุณจะเป็นคำตอบที่ดี
David Z

คำตอบ:


22

เครื่องสร้างตัวเลขสุ่มหลอก (PRNGs)ส่วนใหญ่จะสร้างบนอัลกอริทึมที่เกี่ยวข้องกับวิธีการเรียกซ้ำบางชนิดเริ่มต้นจากค่าฐานที่กำหนดโดยอินพุตที่เรียกว่า "เมล็ด" PRNG ค่าเริ่มต้นในซอฟต์แวร์ทางสถิติมากที่สุด (R, Python, Stata ฯลฯ ) เป็นMersenne Twister อัลกอริทึม MT19937 ซึ่งเป็นชุดที่ออกมาในMatsumoto และนิชิมูระ (1998) นี่เป็นอัลกอริทึมที่ซับซ้อนดังนั้นจึงเป็นการดีที่สุดที่จะอ่านกระดาษบนมันหากคุณต้องการทราบวิธีการทำงานในรายละเอียด ในอัลกอริทึมนี้โดยเฉพาะมีความสัมพันธ์ซ้ำของระดับและเมล็ดอินพุตของคุณคือชุดเริ่มต้นของเวกเตอร์-1} อัลกอริทึมใช้ความสัมพันธ์การเกิดซ้ำเชิงเส้นที่สร้าง:x 0 , x 1 , . . , x n - 1nx0,x1,...,xn1

xn+k=f(xk,xk+1,xk+m,r,A),

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

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

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


+1 มันเป็นการดีที่จะเพิ่มสิ่งที่ (ปกติ) เกิดขึ้นหากไม่มีการให้เมล็ดอย่างชัดเจน
อะมีบาพูดว่า Reinstate Monica

1
@ amoeba: ย่อหน้าที่ 4 ของคำตอบของฉันอธิบายสั้น ๆ นี้
BruceET

1
ในขณะนี้คำตอบพื้นฐานของคำถามมันไม่ได้สัมผัสความจริงว่าทำไมเราต้องใช้สิ่งนี้ในแบบจำลอง มันยากมากที่จะสร้างแบบแผนที่แท้จริง - และเมื่อคุณมีที่คุณไม่สามารถสร้างคำตอบเดิมได้! ป้อน PNRG ... พร้อมปัญหาทั้งหมด
Paul Palmpje

@amoeba: ตามที่ร้องขอฉันได้เพิ่มย่อหน้าเพิ่มเติมลงในเนื้อหานี้
Reinstate Monica

1
ขอบคุณ "เมล็ดเริ่มต้น" ฟังดูราวกับว่ามันเป็นค่าเริ่มต้นของเมล็ดเสมอ สิ่งที่ฉันหมายถึงคือโดยปกติแล้วเมล็ดจะนำมาจากนาฬิกาของระบบ ฉันคิดว่าเป็นสิ่งที่ดีที่จะรู้
อะมีบาพูดว่า Reinstate Monica

16

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

งานที่ยากคือการคิดค้นอัลกอริธึมที่สร้างเอาต์พุตที่ไม่สามารถแยกความแตกต่างจากข้อมูลที่มาจากแหล่งสุ่มอย่างแท้จริง

คุณอยู่ที่การตั้งค่าเริ่มต้นคุณที่จุดเริ่มต้นที่รู้จักกันเฉพาะในรายการของตัวเลขเทียม สำหรับเครื่องกำเนิดไฟฟ้าที่ใช้ใน R, Python และอื่น ๆ รายการมีความยาวมหาศาล นานพอที่ไม่แม้แต่โครงการจำลองที่ใหญ่ที่สุดที่เป็นไปได้จะเกิน 'ระยะเวลา' ของเครื่องกำเนิดเพื่อให้ค่าเริ่มต้นใหม่อีกครั้ง

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

โดยปกติแล้วเอาต์พุตของตัวกำเนิดประกอบด้วยค่าที่ไม่ได้สำหรับวัตถุประสงค์ในทางปฏิบัติสามารถแยกความแตกต่างจากตัวเลขที่เลือกอย่างแท้จริงในรูปแบบการแจกแจงเครื่องแบบบนจากนั้นหมายเลขหลอกเหล่านั้นจะถูกจัดการเพื่อให้ตรงกับสิ่งที่เราจะได้รับการสุ่มโดยการสุ่มจากการแจกแจงแบบอื่นเช่นทวินามปัวซอง, ปรกติ, เลขชี้กำลัง ฯลฯ(0,1).

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

set.seed(1776);  m = 50000
par(mfrow=c(1,2))
  u = runif(m);  plot(u[1:(m-1)], u[2:m], pch=".")
  u = runif(m);  plot(u[1:(m-1)], u[2:m], pch=".")
par(mfrow=c(1,1))

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

บางครั้งมันมีประโยชน์ในการตั้งค่าเมล็ด การใช้งานดังกล่าวมีดังนี้:

  1. เมื่อการเขียนโปรแกรมและการดีบักมันสะดวกที่จะมีผลลัพธ์ที่คาดการณ์ได้ โปรแกรมเมอร์จำนวนมากวางset.seedคำสั่งเมื่อเริ่มต้นโปรแกรมจนกระทั่งการเขียนและการดีบักเสร็จสิ้น

  2. เมื่อสอนเกี่ยวกับการจำลองสถานการณ์ ถ้าฉันต้องการแสดงให้นักเรียนเห็นว่าฉันสามารถจำลองการตายแบบยุติธรรมโดยใช้sampleฟังก์ชั่นใน R ฉันสามารถโกงรันการจำลองจำนวนมากและเลือกอันที่ใกล้เคียงกับค่าตามทฤษฎีเป้าหมายมากที่สุด แต่นั่นจะให้ความรู้สึกที่ไม่สมจริงว่าการจำลองใช้งานได้จริงอย่างไร

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

    ตัวอย่างเช่นความน่าจะเป็นที่จะได้รับ 10 ทั้งหมดเมื่อกลิ้งลูกเต๋าสองลูกที่เป็นธรรมคือด้วยการทดลอง 2 ล้านครั้งฉันควรได้ความแม่นยำสองหรือสามตำแหน่ง ข้อผิดพลาดของการจำลองที่ขอบ 95% นั้นมีค่าประมาณ

    3/36=1/12=0.08333333.
    2(1/12)(11/12)/106=0.00055.
    set.seed(703);  m = 10^6
    s = replicate( m, sum(sample(1:6, 2, rep=T)) )
    mean(s == 10)
    [1] 0.083456         # aprx 1/12 = 0.0833
    2*sd(s == 10)/sqrt(m)
    [1] 0.0005531408     # aprx 95% marg of sim err.
    
  3. เมื่อแบ่งปันการวิเคราะห์ทางสถิติที่เกี่ยวข้องกับการจำลอง ทุกวันนี้การวิเคราะห์ทางสถิติหลายอย่างเกี่ยวข้องกับการจำลองเช่นการทดสอบการเปลี่ยนรูปหรือตัวอย่างกิ๊บส์ ด้วยการแสดงเมล็ดให้คุณเปิดใช้งานคนที่อ่านการวิเคราะห์เพื่อจำลองผลลัพธ์ถ้าพวกเขาต้องการ

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


1
ดีมาก +1 ฉันใช้เสรีภาพในการเพิ่มจุดที่สี่
S. Kolassa - Reinstate Monica

ดังนั้นคุณหมายถึงเครื่องกำเนิดหมายเลขหลอกโดยทั่วไปจะเก็บลำดับแบบสุ่มเป็นระยะ (กระจายอย่างสม่ำเสมอใน [0, 1]) และเมล็ดเป็นเพียงดัชนีไปยังลำดับหรือไม่ มันหมายความว่าจำนวนสุ่มที่สร้างขึ้นเป็นฟังก์ชันที่กำหนดขึ้นของเมล็ดหรือไม่
Della

9
คุณไม่จำเป็นต้องใช้คอมพิวเตอร์ควอนตัมเพื่อใช้ปรากฏการณ์ควอนตัมที่จะมีเครื่องกำเนิดแบบสุ่ม ( en.wikipedia.org/wiki/Hardware_random_number_generator )
Guiroux

1
@Della คุณมีความคิดที่ถูกต้องเป็นหลัก แต่โปรดเข้าใจว่าในทางปฏิบัติ 'ระยะเวลา' จะต้องมีขนาดใหญ่มาก (ไม่ว่าโครงการจำลองของคุณจะใหญ่ขนาดไหนคุณไม่ต้องการให้ทำซ้ำ) ตัวอย่างเช่นความคิดเห็น IonicSolutions หลังจาก Q ที่ตัวสร้าง Mersenne Twilster มีระยะเวลาค่อนข้างใหญ่กว่าที่ฉันจะมองเห็นได้ง่าย // ถ้าคุณรู้ว่าเมล็ดพันธุ์, คุณสามารถผลิตเมล็ดเทียมเทียมได้จากตรงนั้น // Generators ถูกใช้เพื่อเข้ารหัสข้อความ แต่มาตรฐานสำหรับเครื่องกำเนิดไฟฟ้าที่ปลอดภัยสำหรับการเข้ารหัสนั้นแตกต่างจากมาตรฐานสำหรับเครื่องกำเนิดไฟฟ้าสำหรับการจำลองความน่าจะเป็น 2199371,
BruceET

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

0

TL; DR;

เมล็ดมักจะช่วยให้คุณสามารถทำซ้ำลำดับของตัวเลขสุ่ม ในความหมายนั้นพวกเขาไม่ใช่ตัวเลขสุ่มจริง แต่เป็น "ตัวเลขสุ่มหลอก" ดังนั้นตัวสร้าง PNR (PNRG) สิ่งเหล่านี้เป็นความช่วยเหลือที่แท้จริงในชีวิตจริง!

รายละเอียดเพิ่มเติมเล็กน้อย:

เครื่องกำเนิดตัวเลขแบบสุ่มทั้งหมดที่นำไปใช้ในภาษาคอมพิวเตอร์นั้นเป็นเครื่องกำเนิดตัวเลขแบบหลอก นี่เป็นเพราะได้รับค่าเริ่มต้น (===> เมล็ด) พวกเขาจะให้ลำดับของผลลัพธ์แบบสุ่มหลอกเสมอ เครื่องกำเนิดไฟฟ้าที่ดีจะสร้างลำดับที่ไม่สามารถแยกความแตกต่าง - ในแง่สถิติ - จากลำดับสุ่มที่แท้จริง (โยนตายจริงเหรียญจริง ฯลฯ )

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

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

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

คอมพิวเตอร์ควอนตัม? ฉันไม่แน่ใจว่าจะแก้ไข

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