Linux 上 Mono 中的 System.Random 的默认种子



我对此的证据纯粹是轶事,但似乎 Mono 下新System.Random实例的默认种子(...至少在我的Xbox顶部的Linux盒子上...更新速度非常慢。我知道这个类并不完全是加密强的或任何东西,但它确实让我感到困扰,因为这段代码的行为在 Windows 上明显不同。

知道它被播种了什么吗?另外,我可以使用什么在Linux/Mono上更好地工作?

编辑:对于一个在制作新的随机实例时保持运行的程序来说,这是一个容易解决的问题(使用时钟刻度作为随机数种子<- 我知道这里有很棒的代码示例),但该程序启动,打印结果,然后停止。

$ roll 2d6
4 (1, 3)

这是琐碎的定义,但它的效果并不好。

即使在Windows上,我认为您也可能会遇到麻烦,具体取决于您的机器有多快。创建Random实例过快是 .NET 中众所周知的问题,甚至在进程之间也可能发生这种情况。

一些替代方案:

  • 使用 RNGCryptoServiceProvider 生成用于程序的随机数据
  • 使用 Guid.NewGuid().GetHashCode() 显式为 Random 类设定种子
  • 运行一个保持活动状态的守护进程(这样您就可以随着时间的推移继续使用相同的Random实例),并将随机数分发给请求它们的进程

我不知道第一个选项在 Mono 上是否可用,但它从 .NET 的早期就已经存在了,所以我猜它是。我认为第二种选择是最简单的,可能会正常工作。

最新更新