簡體   English   中英

C#中的隨機數生成

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM