【发布时间】:2014-08-21 15:48:44
【问题描述】:
.NET 框架中的 Random 对象采用 32 位整数作为种子。这意味着任何使用 Random 对象的洗牌算法都被限制为(最多)40 亿次可能的洗牌(假设洗牌是根据随机序列确定的,我无法想象为什么它不会)。这意味着一旦集合超过 13 个元素,就可以保证 shuffle 不会覆盖所有可能的排列。随着集合大小远离这个大小,shuffle 覆盖的可能排列的子集变得越来越微不足道。
40 亿是一个(主观上)很大的数字,但如果您正在生成一个集合的多个“随机”排列,那么重复的机会就会变得比它应该的要大得多(特别是当您考虑生日悖论/鸽洞原理时) .
有什么简单的方法不涉及我实现自己的随机数生成器吗?
【问题讨论】:
-
有趣,所以最好的情况下覆盖率将是 4bil^n 其中 n 是我洗牌的次数。唯一的问题是,如果洗牌真的很快,我可能需要睡一毫秒以确保种子不同。
-
如果您的应用/项目适合,您可以考虑使用 Random.org 的在线 API 进行随机生成;只是我的两分钱。
-
如果您将其用于例如出于游戏目的,您可能应该切换到加密安全的 RNG。
-
分而治之:int digitNum = 10;长 l = 0;随机 r = new Random(DateTime.Now.Millisecond); for (int i = 0; i
-
请注意,DateTime.Millisecond 可能仅每隔几毫秒更改一次,具体取决于系统。
标签: c# .net algorithm random shuffle