Sự khác biệt giữa UnityEngine.Random và System.Random là gì?


24

Có gì khác nhau giữa cái này

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

và cái này

// 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);

Tôi biết System.Randomphải luôn luôn được khởi tạo ở đầu lớp của bạn những gì UnityEngine.Randomkhông cần thiết. Tôi cũng biết rằng nó System.Randomhoạt động với một "đồng hồ" thực tập và số "ngẫu nhiên" dựa trên đó.

Câu hỏi của tôi bây giờ là có một số khác biệt giữa UnityEngine.RandomSystem.Randomvà mã phù thủy tốt hơn để sử dụng cho một dự án Unity?

Câu trả lời:


23

Có thể cho rằng sự khác biệt quan trọng nhất là Unity Random.Rangedễ sử dụng hơn một chút, là tĩnh. System.RandomTuy nhiên, thư viện lớp cơ sở C # cung cấp cho bạn nhiều quyền kiểm soát và cách ly hơn.

Có thể họ cũng sử dụng các triển khai khác nhau (mặc dù tôi đoán là Unity Randomchỉ được triển khai về mặt hệ thống Random), nhưng đó có lẽ không phải là vấn đề đáng chú ý. Về cơ bản, cả hai đều có khả năng là cùng một loại trình tạo số ngẫu nhiên: một trình tạo ngẫu nhiên giả dựa trên việc lặp lại một chuỗi được xác định bởi một số hạt giống).

Vấn đề kiểm soát có liên quan hơn, bởi vì trong một số bối cảnh bạn có thể muốn sử dụng các luồng ngẫu nhiên khác nhau cho những thứ khác nhau. Ví dụ: trong ngữ cảnh mạng kết nối khóa bước, bạn có thể muốn sửa hạt giống được sử dụng để tạo các sự kiện ảnh hưởng đến trò chơi ngẫu nhiên trên tất cả người chơi trong trò chơi, nhưng bạn có thể không quan tâm lắm đến luồng số ngẫu nhiên được sử dụng hoàn toàn các sự kiện trực quan và có thể cho phép luồng đó được gieo hạt theo kiểu truyền thống hơn (ví dụ như với thời gian hoạt động của hệ thống khi ra mắt trò chơi).

Tương tự, nếu bạn định tạo số ngẫu nhiên trong nhiều luồng, bạn có thể muốn sử dụng các đối tượng ngẫu nhiên riêng biệt cho từng luồng để ngăn điều kiện cuộc đua. Điều này có thể xuất hiện nếu logic trò chơi của bạn chạy trên nhiều luồng và bạn cũng có một hệ thống phát lại trò chơi, ví dụ.

Cuối cùng, nó cũng không hẳn tốt hơn để sử dụng một hay khác nói chung, chứ không phải có những ưu và nhược điểm. Khi bạn cần tách chuỗi số khỏi các chuỗi ngẫu nhiên tiềm năng khác có thể xảy ra hoặc khi bạn cần kiểm soát cục bộ đối với hạt giống của chuỗi, hãy sử dụng một thể hiện của System.Random. Nếu bạn chỉ cần một giá trị ngẫu nhiên nhanh chóng và bẩn thỉu cho việc sử dụng vứt đi hoặc một số tình huống không ảnh hưởng khác, đơn giản hóa của Unity Randomcó thể là tốt.


3
Một điều mà một số trò chơi làm là lưu giá trị hạt giống khi người chơi lưu trò chơi. Bằng cách đó, các hành động tương tự dẫn đến hậu quả tương tự. Nó không khuyến khích lưu scumming và nếu bạn quên lưu vào một thời điểm sau, bạn có thể quay lại nơi bạn đã ở trước đó. XCOM cuối cùng đã làm điều đó.
GregRos

3
@GregRos Lưu ý tốt, nhưng nó có thể giới thiệu một kiểu lừa đảo tiết kiệm khác như được mô tả trong bài viết này - về cơ bản thay vì thử lại cùng một động tác cho đến khi họ thành công, người chơi thử các chuỗi di chuyển khác nhau cho đến khi họ di chuyển trên hầu hết các vùng đất trên các cuộn thành công trong trình tự được xác định trước. Hóa ra có nhiều cách để tiết kiệm trong bất kỳ hệ thống nào có lưu. Scummers Gonna Scum, vì vậy đôi khi nó hợp lý với dòng chảy như XCOM đã làm .
DMGregory

10

UnityEngine.Random có ​​một vài lợi thế dễ sử dụng:

  • Có thể truy cập tĩnh / toàn cầu - bạn không cần tạo một thể hiện cho từng đối tượng hoặc hệ thống cần sự ngẫu nhiên. Hầu hết hoặc tất cả các tập lệnh của bạn có thể chia sẻ tài nguyên này.

  • Các phương thức tiện lợi - bạn có thể sử dụng Random.Range (), Random.insideUnitSphere, Random.rotationUniform, Random.ColorHSV () để có được các giá trị ngẫu nhiên được phân phối độc đáo của các loại hữu ích khác nhau mà không cần phải cuộn toán học của riêng bạn.

(Tôi chưa tìm thấy bất kỳ xác nhận nào về việc UnityEngine.Random cung cấp bất kỳ tính nhất quán đa nền tảng nào khác với việc triển khai Mono của System.Random - chúng có thể hoặc không giống nhau dưới mui xe)

Tất nhiên, bạn có thể xây dựng lớp riêng của mình sử dụng System.Random (hoặc thư viện khác hoặc PRNG của riêng bạn) để làm điều này, nhưng phần hay là bạn không cần - Việc triển khai của Unity có nghĩa là cung cấp cho bạn một cơ sở tốt cho hành vi ngẫu nhiên ra khỏi hộp.

Điều đó nói rằng, có những trường hợp bạn sẽ muốn sử dụng các nguồn ngẫu nhiên khác:

  • Nếu bạn đang sử dụng nhiều luồng, mỗi luồng nên có nguồn giả ngẫu nhiên riêng để tránh sự tranh chấp (UnityEngine.Random chỉ có thể truy cập trên luồng chính)

  • Nếu bạn cần một chuỗi giả ngẫu nhiên xác định (ví dụ: đối với trình tạo mức hạt giống), bạn có thể muốn hệ thống đó có nguồn giả ngẫu nhiên riêng mà không tập lệnh nào khác có thể truy cập, do đó, sự khác biệt về thứ tự thực hiện không gây ra bỏ qua các con số và phá vỡ tính quyết định mà bạn đang tính. Để biết thêm thông tin, có một bài đăng tuyệt vời trên blog Unity về các số ngẫu nhiên được gieo hạt giống .

  • nếu bạn cần sự ngẫu nhiên mạnh mẽ về mật mã để bảo mật, đánh bạc hoặc tạo ID duy nhất, bạn nên sử dụng các thư viện chuyên dụng cho mục đích này. Cả UnityEngine.Random và System.Random đều không cung cấp đủ đảm bảo chất lượng.


Rất tiếc, xin lỗi JoshPetrie và Jon - Tôi đã mất một lúc gõ nó trên điện thoại di động, vì vậy tôi đã không thấy câu trả lời của bạn cho đến khi tôi đăng nó. Có vẻ như tất cả chúng ta đều bao phủ mặt đất tương tự.
DMGregory

Đối với tính ngẫu nhiên ở cấp độ tiền điện tử, hãy xem RNGCryptoServiceProvider nhưng hãy nhớ rằng nó rất chậm và nó bị loại trừ khỏi tất cả các nền tảng .NET bị tước của Unity.
McGuireV10

6

UnityEngine.Random là tĩnh. Nếu bạn muốn tạo nhiều phiên bản của trình tạo số ngẫu nhiên, thì bạn sẽ muốn sử dụng System.Random.

Không có cách nào để tra cứu mã nguồn cho Thực hiện Unity, tuy nhiên, Microsoft cung cấp nguồn cho System.Random .


3
Không phải nguồn của Microsoft không phải là nguồn được Unity sử dụng. Bạn nên nhìn vào nguồn Mono thay thế.
Arturo Torres Sánchez
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.