我正在写一个纸牌游戏,需要从堆中随机抽取卡片。我正在使用Random和Random.Next(..)。 现在我想调试我的应用程序,并希望能够使用相同的随机序列重现某些场景。 任何人都可以帮忙......?几次搜索都找不到答案。 感谢。
答案 0 :(得分:9)
答案 1 :(得分:4)
您需要为随机数生成器播种。假设您正在使用System.Random
,请使用
Random r = new Random(<some integer>);
在<some integer>
开始序列。
但这里有一个重要的注意事项:你需要仔细研究你的随机数发生器。否则,有可能破译您的序列,这将使您的游戏无意中为精明的用户带来利润。我怀疑你在投入生产后会使用Random
。(从技术上讲,它可以破译一个线性同余序列 - 这是C#使用的 - 在三点多一点的时候附图。)
答案 2 :(得分:1)
使用相同的种子创建System.Random
实例:
Random random = new System.Random(1337);
答案 3 :(得分:1)
在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!!");
}
答案 4 :(得分:1)
对于这种情况可能有点过分(使用种子会给你重复性)但是处理依赖关系的良好形状是你没有完全控制的是包装依赖关系并通过接口访问它。这将允许您交换为单元测试/调试提供指定行为的版本。
<强> e.g。强>
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++];
}
}
此方法的一个不错的方面是您可以使用特定值(例如,测试边缘情况),这些值可能很难使用固定的种子值生成。