我最近在这里回答了一个问题,由成员@dtb 编辑。
问题涉及使用 Random() - 并且说成员编辑了我的答案以避免这种常见的陷阱(正如他所说)
我的原始代码孤立地不容易受到此问题的影响,如下所示:
public void DoStuff()
{
var rand = new Random();
while() {} //Inner loop that uses 'rand'
}
答案已被编辑,因为它的意图似乎是在循环中调用该函数 - 这会使代码易受攻击 - 它本质上被更改为:
public void DoStuff(Random R)
{
while() {} //Inner loop that uses 'rand'
}
我的直接想法是——这只是将维护 Random 实例的负担推到了更高的堆栈上——如果有问题的程序员不理解它是如何实现的,他们仍然会陷入这个陷阱。
我想我的问题是 - 为什么 .Net 中的 Random() 不以与 Javascript 中相同的方式实现,例如 - 使用一个静态的全局 Random() (比如说,每个 AppDomain?)?自然地,您仍然可以提供更明确的重载/方法,将当前时间用作种子,用于需要控制种子的极少数情况。
当然,这将避免这个非常常见的陷阱。谁能告诉我.Net方法的好处?
编辑:我知道控制种子很重要 - 但是,默认情况下强制执行似乎是一个奇怪的选择。如果有人想控制种子,他们很可能知道自己在做什么。
干杯。