【问题标题】:Default seed for System.Random in Mono on Linux?Linux 上 Mono 中 System.Random 的默认种子?
【发布时间】:2026-01-04 12:15:02
【问题描述】:

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

知道它的种子是什么吗?另外,我可以使用什么在 Linux/Mono 上效果更好?

编辑:对于一个在创建 Random 的新实例时保持运行的程序来说,这是一个很容易解决的问题(Using clock ticks as random number seed

$ roll 2d6
4 (1, 3)

这是微不足道的定义,但它并不是那么好。

【问题讨论】:

    标签: c# .net random mono


    【解决方案1】:

    即使在 Windows 上,我认为您也可能会遇到麻烦,具体取决于您的计算机的速度。过快地创建 Random 实例是 .NET 中的一个众所周知的问题,甚至在进程之间也可能发生。

    一些替代方案:

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

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

    【讨论】:

    • 你是对的,当然; Linux 种子的分辨率似乎(甚至)低于 Windows 的。
    • 也许吧。或者可能是 Linux 启动新进程的开销较低,因此在您的测试中,您可以比在 Windows 上更频繁地运行程序。我真的不知道。我很高兴你发现这些建议很有帮助! :)
    • 请记住,在.Next()-call 周围进行exlcusiv 锁定可以挽救生命(包括我的)。
    • 当测试一次手动运行一个时,这些都不重要。