簡體   English   中英

隨機種子c# - 如何為調試生成相同的數字序列

[英]Random seed c# - How to generate same sequence of numbers for debug

我正在寫一個紙牌游戲,需要從堆中隨機抽取卡片。 我正在使用Random和Random.Next(..)。 現在我想調試我的應用程序,並希望能夠使用相同的隨機序列重現某些場景。 任何人都可以幫忙......? 幾次搜索都找不到答案。 謝謝。

使用接受種子值的Random構造函數的重載

static Random r = new Random(0);

這將在每次執行時產生相同的偽隨機數序列。

您需要為隨機數生成器播種。 假設您正在使用System.Random ,請使用

Random r = new Random(<some integer>);

它以<some integer>開始序列。

但這里有一個重要的注意事項:你需要仔細研究你的隨機數發生器。 否則,有可能破譯您的序列,這將使您的游戲無意中為精明的用戶帶來利潤。 我懷疑你一旦投入生產就會使用Random (從技術上講,可以解讀一個線性同余序列 - 這是C#使用的 - 在三個以上的圖紙中。)

使用相同的種子創建System.Random實例:

Random random = new System.Random(1337);

在Random構造函數中使用相同的種子。 這可以保證Next()會給出相同的結果。 例如

Random randomGen1 = new Random(5);

Random randomGen2 = new Random(5);

int r1 = randomGen1.Next();
int r2 = ramdomGen2.Next();

if(r1 == r2)
{
 Console.WriteLine("Great success!!");
}

對於這種情況可能有點過分(使用種子會給你重復性)但是處理依賴關系而你沒有完全控制的良好形狀是包裝依賴關系並通過接口訪問它。 這將允許您交換為單元測試/調試提供指定行為的版本。

例如

public interface IRandom {
    int Get();
}

public class DefaultRandom : IRandom {
    private readonly Random random;

    public DefaultRandom() {
        random = new Random();
    }

    public int Get() {
        return random.Next();
    }
}

public class TestRandom : IRandom {

    private readonly List<int> numbers;
    private int top;

    public TestRandom() {
        numbers = new List<int> {1, 1, 2, 3, 5, 8, 13, 21};
        top = 0;
    }

    public int Get() {
        return (top >= numbers.Count)
                ? 0
                : numbers[top++];
    }
}

此方法的一個不錯的方面是您可以使用特定值(例如,測試邊緣情況),這些值可能很難使用固定的種子值生成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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