UnityEngine.Random และ System.Random แตกต่างกันอย่างไร


24

ความแตกต่างระหว่างนี้คืออะไร

int randomNumber = UnityEngine.Random.Range(0, 10);

และนี่

// on top of the class
private System.Random _rnd = new System.Random();

// inside a methode of the same class
int randomNumber = _rnd.Next(0, 10);

ฉันรู้ว่าSystem.Randomจะต้องมีการเริ่มต้นด้านบนของชั้นเรียนของคุณโดยUnityEngine.Randomไม่จำเป็นต้องมี ฉันรู้ว่ายังSystem.Randomทำงานร่วมกับ "นาฬิกา" ฝึกงานและหมายเลข "สุ่ม" จะขึ้นอยู่กับที่

คำถามของฉันตอนนี้มีความแตกต่างอื่น ๆ ระหว่างUnityEngine.RandomและSystem.Randomกับรหัสแม่มดจะดีกว่าที่จะใช้สำหรับโครงการความสามัคคี?

คำตอบ:


23

ความแตกต่างที่สำคัญที่สุดคือความสามัคคีRandom.Rangeที่ใช้งานง่ายกว่าเล็กน้อย System.Randomอย่างไรก็ตามไลบรารี่คลาส C # ให้การควบคุมและแยกตัวคุณได้มากขึ้น

เป็นไปได้ว่าพวกเขายังใช้การใช้งานภายใต้ประทุนที่แตกต่างกัน (แม้ว่าฉันจะเดาได้ว่า Unity's Randomนั้นมีการใช้งานในแง่ของระบบRandom) แต่นั่นอาจไม่น่าเป็นห่วง พื้นฐานพวกเขาทั้งสองมีแนวโน้มเดียวกันชนิดของเครื่องกำเนิดไฟฟ้าจำนวนสุ่ม: กำเนิดสุ่มหลอกอยู่บนพื้นฐานของการทำซ้ำลำดับที่กำหนดโดยเมล็ดบางส่วน)

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

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

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


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

3
@GregRos ข้อความที่ดี แต่สามารถแนะนำวิธีการบันทึกแบบอื่น ๆ ตามที่อธิบายไว้ในบทความนี้ - โดยทั่วไปแล้วแทนที่จะลองซ้ำไปเรื่อย ๆ จนกว่าพวกเขาจะประสบความสำเร็จผู้เล่นจะลองลำดับการเคลื่อนไหวที่แตกต่างกันไป ในม้วนที่ประสบความสำเร็จในลำดับที่กำหนดไว้ล่วงหน้า ปรากฎว่ามีวิธีการบันทึกจำนวนเงินในระบบใด ๆ ที่มีการบันทึก Scummers จะไปฝาดังนั้นบางครั้งมันทำให้รู้สึกไปกับการไหลเป็น XCOM ได้
DMGregory

10

UnityEngine.Random มีข้อได้เปรียบในการใช้งานง่าย:

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

  • วิธีการความสะดวกสบาย - คุณสามารถใช้ Random.Range (), Random.insideUnitSphere, Random.rotationUniform, Random.ColorHSV () เพื่อรับค่าสุ่มชนิดต่าง ๆ ที่มีประโยชน์กระจายโดยไม่ต้องหมุนคณิตศาสตร์ของคุณเอง

(ฉันยังไม่พบคำยืนยันใด ๆ เกี่ยวกับ UnityEngine.Random ให้การรับรองความสอดคล้องข้ามแพลตฟอร์มใด ๆ ที่แตกต่างจากการใช้งานโมโนของระบบการสุ่ม - พวกเขาอาจหรืออาจจะไม่เหมือนกันภายใต้ประทุน)

แน่นอนคุณสามารถสร้างคลาสของคุณเองที่ใช้ System.Random (หรือไลบรารีอื่นหรือ PRNG ของคุณเอง) เพื่อทำสิ่งนี้ แต่ส่วนที่ดีคือคุณไม่จำเป็นต้อง - การใช้งานของ Unity มีไว้เพื่อเป็นพื้นฐานที่ดีสำหรับคุณ พฤติกรรมแบบสุ่มนอกกรอบ

ดังกล่าวมีกรณีที่คุณต้องการใช้แหล่งที่มาของการสุ่มอื่น ๆ :

  • หากคุณใช้หลายเธรดแต่ละเธรดควรมีแหล่งที่มาของ pseudorandomness เพื่อหลีกเลี่ยงความขัดแย้ง (UnityEngine.Random สามารถเข้าถึงได้บนเธรดหลักเท่านั้น)

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

  • หากคุณต้องการการสุ่มเสี่ยงสูงในการรักษาความปลอดภัยการพนันหรือการสร้างรหัสเฉพาะคุณควรใช้ไลบรารีเฉพาะสำหรับจุดประสงค์นี้ UnityEngine.Random หรือ System.Random ให้การรับประกันคุณภาพที่เพียงพอ


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

สำหรับการสุ่มระดับ crypto ดูที่RNGCryptoServiceProviderแต่โปรดจำไว้ว่ามันช้ามากและมันถูกแยกออกจากแพลตฟอร์ม. NET ทั้งหมดของ Unity
McGuireV10

6

UnityEngine.Random เป็นแบบคงที่ หากคุณต้องการสร้างตัวสร้างตัวเลขสุ่มหลายอินสแตนซ์คุณจะต้องใช้ System.Random

ไม่มีทางที่จะขึ้นไปดูรหัสที่มาสำหรับการดำเนินความสามัคคีไม่เป็น แต่ไมโครซอฟท์ยังมีแหล่งสำหรับSystem.Random


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