c# - 如何强制 Random 的所有实例在不同的运行中生成相同的数字序列?
问题描述
我正在编写一个应用程序来测试具有随机生成输入的算法。Random
这涉及在代码中散布的几个类实例。当我发现意外结果时,我需要所有这些实例在不同的运行中生成相同的输入来调试算法。这是使用 Delphi 创建的应用程序的行为,除非您手动调用Randomize
.
我知道我可以:
- 为所有创建的实例提供常量种子。
- 将使用常量种子创建的唯一实例传递给需要随机生成器的所有方法。
我不喜欢使用上述任何一种方法的原因是,大多数生成随机数据的函数都是一种在互联网上到处收集的黑盒函数。其中一些甚至出于未知原因使用了几个随机生成器。除非我真的必须这样做,否则我宁愿不要弄乱这些功能。
那么,还有其他方法可以同时控制所有这些实例吗?
解决方案
这是一个具有两个静态成员的类的快速示例,一个是“固定 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;
}
}
}
推荐阅读
- python - 响应期间出现错误:error=HTTP 599: Stream closed
- php - 使用未按预期工作的外部类
- javascript - 如何为每个对象存储一个对象的值
- amazon-web-services - 关于在Jenkins中配置上传docker镜像到ECR策略的问题
- java - 列表
@Test 从最后一个索引中删除 null - javascript - 将对象数组转换为属性数组
- webcam.js - Webcam.js 错误:在服务器上找不到受支持的网络摄像头接口错误,但在 localhost 中没有
- azure - Azure 是否对被网络安全组 (NSG) 防火墙规则阻止的传入流量收费?
- docker - 在主镜像 Dockerfile 中重新运行 COPY 指令以替换基础镜像中已经存在的同名文件
- javascript - JS Web 蓝牙 API:不支持错误 startNotification()