我最近在这里回答了一个问题,由成员@dtb 编辑。
filling a array with uniqe random numbers between 0-9 in c#
问题涉及 Random() 的使用 - 并且说成员已经编辑了我的答案以避免这种情况 common pitfall (正如他所说)
我的原始代码不受此问题的影响,如下所示:
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 方法的好处?
编辑:我知道控制种子很重要 - 但是,默认 强制执行此操作似乎是一个奇怪的选择。如果有人想控制种子,他们很可能知道自己在做什么。
干杯。
最佳答案
因为这样你可以控制多个随机生成源。通过为每个实例设置相同的种子,您可以根据需要生成相同的序列。有时您不希望其他操作影响您的数字流。
想想一个游戏:每个随机数都是从一个种子数生成的,所以如果您保存玩家输入和随机数种子,就可以从头到尾重现整个游戏。但是如果你生成随机的,例如粒子,或其他不相关但随机的东西,你也不想保存它们。最简单的方法是声明两个随机的,一个用于重要的事情,另一个用于其他所有事情。但这只是一个例子。
所以你可以根据自己的需要自由声明随机序列,如果你想这样使用它就不需要使用技巧。
关于c# - 为什么 Random() 在 .Net 中以这种方式实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10699579/