[英]Random number generation in C#
我一直在為培訓練習編寫一些C#代碼,其中我必須創建一個隨機矩形數組。
問題是由我的GetRandomRectangle函數生成的矩形總是相同的。 我正在使用System.Random
生成矩形的坐標。
我意識到這是因為Random對象是使用默認構造函數創建的,因此具有相同的種子。 我已經對其進行了修改,以使每個矩形現在都獲得不同的種子,並且效果很好。
問題是-它如何決定“默認種子”? 我注意到它似乎也不會隨着時間而改變,使用種子2創建的矩形將始終具有相同的尺寸。
這可能是我可以使用Google的東西,但也很高興聽到你們的意見和信息。
謝謝 :)
默認種子是從系統時鍾中獲取的。
我猜想您的GetRandomRectangle
方法被快速連續調用,並且每次都實例化Random
的新實例。 當您執行此操作時, Random
每個實例將從系統時鍾中獲取相同的種子,這就是為什么您的方法每次都創建相同的矩形的原因。
一種解決方案是創建一個 Random
實例並將其傳遞到您的方法中:
Random rng = new Random();
Rectangle foo = GetRandomRectangle(rng);
Rectangle bar = GetRandomRectangle(rng);
Rectangle baz = GetRandomRectangle(rng);
// ...
public Rectangle GetRandomRectangle(Random rng)
{
// create the rectangle using rng
}
實際上,默認的Random()
構造函數與時間有關,並且在第二次運行應用程序時應提供不同的輸出。 如果您每次都得到相同的矩形,則一定是在進行其他操作。
手動提供種子將始終為您提供相同的偽隨機數序列。
您只需要實例化一個Random
對象即可生成所有隨機數。 不要為每個矩形創建一個新實例。
我曾經也使用過它,但是我發現該類產生的值遠不夠隨機值。 我改用密碼學名稱空間中的隨機函數。 這是一個非常簡單的版本,沒有錯誤檢查或屏幕尺寸轉換:
byte[] randomBytes = new byte[4];
RandomNumberGenerator numberGenerator = System.Security.Cryptography.RandomNumberGenerator.Create();
numberGenerator.GetNonZeroBytes(randomBytes);
int x = randomBytes[0];
int y = randomBytes[1];
int width = randomBytes[2];
int height = randomBytes[3];
System.Drawing.Rectangle block = new Rectangle(x, y, width, height);
當您使用種子時,這意味着您想要從該種子開始的相同序列
嘗試沒有種子的構造函數
我不是C#專家,但這可能有用。
public Rectangle GetRandomRectangle()
{
static Random rng=new Random();
// create the rectangle using rng
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.