วิธีที่ดีที่สุดในการหว่าน N ตัวสร้างตัวเลขสุ่มแบบอิสระจาก 1 ค่า


10

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

มันเพียงพอแล้วหรือไม่ที่จะเพิ่มเมล็ดตามลำดับสำหรับแต่ละดัชนี?

ขณะนี้ฉันใช้numpyของRandomStateซึ่งใช้ตัวสร้างตัวเลขสุ่มหลอก Mersenne Twister

ตัวอย่างโค้ดด้านล่าง:

# If a random number generator seed exists
if self.random_generator_seed:
    # Create a new random number generator for this instance based on its
    # own index
    self.random_generator_seed += instance_index
    self.random_number_generator = RandomState(self.random_generator_seed)

โดยพื้นฐานแล้วฉันเริ่มต้นด้วยเมล็ดที่ผู้ใช้ป้อน (ถ้ามี) และสำหรับแต่ละอินสแตนซ์ / เธรดฉันตามลำดับเพิ่มดัชนี (0 ถึง N-1) ของอินสแตนซ์ที่กำลังทำงานอยู่ ฉันไม่รู้ว่านี่เป็นการฝึกฝนที่ดีหรือว่ามีวิธีที่ดีกว่าในการทำเช่นนี้


1
คุณรู้ล่วงหน้าหรือไม่ว่าจะใช้ค่าหลอกหลอกจำนวนเท่าไหร่ที่แต่ละเธรดจะใช้ - หรืออย่างน้อยคุณก็จะได้ค่าประมาณการที่ดีขึ้น
whuber

ไม่, ฉันไม่สามารถ. มันจะสุ่มตัวอย่างภูมิภาคที่จะสรุปจนกระทั่งถึงเกณฑ์ ขนาดของภูมิภาคอาจแตกต่างกันอย่างมีนัยสำคัญ
EricR

คำตอบ:


9

ไม่ใช่การฝึกฝนที่ยอดเยี่ยมอย่างแน่นอน ตัวอย่างเช่นพิจารณาว่าเกิดอะไรขึ้นเมื่อคุณรันสองครั้งด้วยรูทของเมล็ดที่ 12345 และ 12346 การวิ่งแต่ละครั้งจะมีN-1ลำธารเหมือนกัน

การใช้งาน Mersenne Twister (รวมถึงnumpy.randomและrandom) โดยทั่วไปใช้ PRNG ที่แตกต่างกันเพื่อขยายเมล็ดจำนวนเต็มเป็นเวกเตอร์สถานะขนาดใหญ่ (จำนวนเต็ม 624 32- บิต 32 บิต) ที่ MT ใช้ RandomState.get_state()นี้เป็นอาร์เรย์จาก วิธีที่ดีในการทำสิ่งที่คุณต้องการคือการเรียกใช้ PRNG นั้นทำการ seed ด้วยจำนวนเต็มหนึ่งครั้งของคุณและรับN*624จำนวนเต็ม 32- บิตจากนั้น แยกสตรีมที่ขึ้นสู่Nสถานะเวกเตอร์และใช้RandomState.set_state()เพื่อเริ่มต้นแต่ละRandomStateอินสแตนซ์อย่างชัดเจน คุณอาจต้องปรึกษาแหล่งข้อมูล C numpy.randomหรือ_randomจากไลบรารีมาตรฐานเพื่อขอรับ PRNG นั้น (เหมือนกัน) ฉันไม่แน่ใจว่ามีใครติดตั้ง PRNG สำหรับ Python แบบสแตนด์อโลนหรือไม่


ฉันคิดว่านี่อาจเป็นทางออกที่ดีที่สุดที่ฉันเคยได้ยิน ฉันไม่คิดว่ามันสำคัญกับวิธีที่ฉันแยกกระแสข้อมูลให้ถูกต้อง แต่อย่างใด ดูเหมือนว่าไม่น่าจะมีลำดับที่ซ้ำกันบนจำนวนเต็ม 624 32 บิตระหว่าง 624 ไม่ว่าพวกมันจะถูกเลือกจาก PRNG เริ่มต้นและเมล็ด
EricR

1
อันที่จริงฉันจะเดินกลับไปหน่อย ไม่ชัดเจนสำหรับฉันว่า initializer PRNG ได้รับการออกแบบให้มีค่ามากมายที่ดึงมาจากมันโดยพลการ พิจารณาใช้ PRNG คุณภาพอื่น (ไม่เกี่ยวข้องกับ MT) เพื่อสร้างกระแสข้อมูลของรัฐ หนึ่งสามารถใช้ HMAC-DRBG (PRNG โดยใช้ HMAC เป็นพื้นฐานการเข้ารหัส) โดยใช้เพียงไลบรารีมาตรฐานที่ค่อนข้างตรงไปตรงมา การรักษาความปลอดภัยการเข้ารหัสลับไม่ได้กังวล; เพียงความสะดวกในการใช้งานและคุณภาพของบิตสตรีม คุณจะต้องตรวจสอบให้แน่ใจว่าไม่มีการทำเวกเตอร์ที่ไม่มีศูนย์เลยในโอกาสที่หายากมาก
Robert Kern

หรือเพียงแค่ใช้หนึ่งRandomStateในการพัฒนาใหม่ที่ใช้อัลกอริทึมที่มีกระแสข้อมูลที่กำหนด นั่นคือคุณเริ่มต้นแต่ละRandomStateอินสแตนซ์ด้วยเมล็ดเดียวกันและรหัสสตรีมที่แตกต่างกัน (เพิ่มขึ้นเพียงอย่างเดียวก็ใช้ได้) และคุณจะรับประกันสตรีมอิสระ pypi.python.org/pypi/randomstate
Robert Kern

4

โซลูชันที่ใช้ในการประมวลผลแบบขนานคือการใช้ตัวสร้างแบบสุ่มของคุณโดยที่คือเมล็ดของคุณโดย -batches:Φ(u)uN

  1. สร้างΦ(u),ΦN(u),Φ2N(u),...
  2. สร้างΦ2(u),Φ1+N(u),Φ1+2N(u),...
  3. ...
  4. สร้างΦN1(u),ΦN1+N(u),ΦN1+2N(u),...

ที่(U)) วิธีนี้คุณจะใช้เมล็ดเดี่ยวและลำดับของคุณจะเหมือนกันและเป็นอิสระΦn(u)=Φ(Φn1(u))


2

ขณะนี้มีแพ็คเกจ Python ชื่อRandomGenที่มีวิธีการเพื่อให้บรรลุ

มันสนับสนุนลำธารอิสระที่สร้างขึ้นจากเมล็ดเดียวเช่นเดียวกับโปรโตคอลสำหรับการกระโดดเก่าเครื่องกำเนิดไฟฟ้าจำนวนสุ่มเช่น MT19937


0

บางคนอ้างว่ามีความสัมพันธ์ในการสุ่มตัวเลขที่สร้างขึ้นโดยลำดับเมล็ด /programming/10900852/near-seeds-in-random-number-generation-may-give-similar-random-numbersฉันไม่แน่ใจว่ามันจริงแค่ไหน

หากคุณกังวลเกี่ยวกับเรื่องนี้ทำไมไม่ใช้ตัวสร้างตัวเลขสุ่มเดียวเพื่อเลือกเมล็ดพันธุ์สำหรับเครื่องกำเนิดอื่น ๆ ทั้งหมด


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

1
เห็นได้ชัดว่ามีความสัมพันธ์เป็นไปได้กับเมล็ดต่อเนื่อง ... อย่างไรก็ตามเป็นบทความที่เชื่อมโยงในคำตอบจากบล็อกของจอห์นดีคุกแสดงให้เห็นว่าการใช้ RNG หนึ่งรายการเพื่อสร้างเมล็ดพันธุ์ให้กำเนิดอื่น ๆ นั้นแย่กว่ามาก มันบอกว่าการสร้าง 1,000 เมล็ด 16 บิตแบบไม่ได้ลงชื่อมีโอกาส 99.95% ที่ทับซ้อนกัน!
Praveen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.