c# - 为什么 Random() 在 .Net 中以这种方式实现?

标签 c# .net random

我最近在这里回答了一个问题,由成员@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/

相关文章:

c# - LINQ to Entities 查询中的 Include()

python - 3d 随机采样

haskell - 生成范围内随机整数的唯一列表

python - 为什么我的排列检验分析曲线不平滑?

c# - 创建的 AppDomain 上的 AssemblyResolve 事件出现问题

c# - 如何使用 Roslyn 通过扩展方法、静态类中的方法和带有 ref/out 参数的方法访问调用

C#,实现子类定义的具体变量的抽象父类(super class)?

c# - 好的 lambda 表达式或减少每个循环的更好方法

c# - 在 ASP.NET Core 中创建单例服务的正确方法——是否必须使用 static 关键字?

c# - 如何以编程方式安全关闭 Google Chrome