首页 > 解决方案 > 如何强制 Random 的所有实例在不同的运行中生成相同的数字序列?

问题描述

我正在编写一个应用程序来测试具有随机生成输入的算法。Random这涉及在代码中散布的几个类实例。当我发现意外结果时,我需要所有这些实例在不同的运行中生成相同的输入来调试算法。这是使用 Delphi 创建的应用程序的行为,除非您手动调用Randomize.

我知道我可以:

我不喜欢使用上述任何一种方法的原因是,大多数生成随机数据的函数都是一种在互联网上到处收集的黑盒函数。其中一些甚至出于未知原因使用了几个随机生成器。除非我真的必须这样做,否则我宁愿不要弄乱这些功能。

那么,还有其他方法可以同时控制所有这些实例吗?

标签: c#testingrandom

解决方案


这是一个具有两个静态成员的类的快速示例,一个是“固定 RNG”,另一个只是普通的“RNG”,您可以在代码中的任何位置使用它:

int x = MyRandom.RNG.Next(1, 7);
int y = MyRandom.FixedRNG.Next(1, 7);

代码:

public class MyRandom
{

    private static Random _fixedRandom = new Random(1234);
    private static Random _random = new Random();

    public static Random FixedRNG
    {
        get
        {
            return _fixedRandom;
        }
    }

    public static Random RNG
    {
        get
        {
            return _random;
        }
    }

}

另一种方法可能是包含一个IsRandom确定返回哪个属性的属性:

public class MyRandom
{

    private static bool _isRandom = false;
    private static Random _fixedRandom = new Random(1234);
    private static Random _random = new Random();

    public static bool IsRandom
    {
        get
        {
            return _isRandom;
        }
        set
        {
            _isRandom = value;
        }
    }

    public static Random RNG
    {
        get
        {
            if (IsRandom)
                return _random;
            else
                return _fixedRandom;
        }
    }

}

推荐阅读