4

我正在写一个纸牌游戏,需要从一堆中随机抽取卡片。我为此使用 Random 和 Random.Next(..)。现在我想调试我的应用程序,并希望能够使用相同的随机序列重现某些场景。任何人都可以帮助...?经过多次搜索,我找不到答案。谢谢。

4

5 回答 5

11

Random使用接受种子值的构造函数的重载

static Random r = new Random(0);

这将在每次执行中产生相同的伪随机数序列。

于 2013-09-16T10:36:43.167 回答
4

您需要播种随机数生成器。假设您正在使用System.Random,请使用

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

从 开始序列<some integer>

但这里有一个重要说明:您需要仔细研究随机数生成器。否则,可能会破译您的序列,这将使精明的用户在无意中玩您的游戏有利可图。Random我怀疑一旦你进入生产阶段你会使用。(从技术上讲,可以在三张多一点的图中破译线性同余序列 - 这是 C# 使用的。)

于 2013-09-16T10:40:19.707 回答
1

对于这种情况,可能有点矫枉过正(使用种子会给您带来可重复性),但处理您无法完全控制的依赖关系的一个好方法是包装依赖关系并通过接口访问它。这将允许您换入为单元测试/调试提供指定行为的版本。

例如

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++];
    }
}

此方法的优点之一是您可以使用特定值(例如,测试边缘情况),使用固定种子值可能难以生成这些值。

于 2013-09-16T11:39:53.420 回答
1

创建System.Random具有相同种子的实例:

Random random = new System.Random(1337);
于 2013-09-16T10:37:03.750 回答
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!!");
}
于 2013-09-16T10:45:37.453 回答