.NET框架中的Random对象采用32位整数作为种子。这意味着任何使用Random对象的混洗算法都被限制为(最多)40亿次可能的混洗(假设混洗是根据随机序列确定的,我无法想象为什么不是这样)。这意味着,一旦集合超过13个元素,就可以保证混洗不会覆盖所有可能的排列。随着集合大小进一步远离这个大小,混洗所覆盖的可能排列的子集变得越来越不重要。
40亿是一个(主观上)很大的数字,但是如果你生成一个集合的多个“随机”排列,重复的可能性就会比它应该的大得多(特别是当你考虑生日悖论/鸽洞原理时)。
有没有什么简单的方法可以不让我实现自己的随机数生成器?
发布于 2014-07-01 16:16:42
我不推荐创建您自己的随机数生成器(RNG)。他们背后的理论是相当坚实的。如果你需要一些“更随机”的东西,那么你需要使用一个加密的安全RNG。要使用.Net框架提供的默认生成器:
使用System.Security.Cryptography;
var生成器= RandomNumberGenerator.Create();
您可以使用它来获取一些随机字节,您可以将这些字节转换为int或其他值类型。
发布于 2014-07-01 22:07:09
您可以使用C#的免费ports of Mersenne Twister之一。MT19937有一个19937位的状态空间,虽然您可以选择用单个int作为种子,但是如果您有合适的熵源提供给它,也可以使用完整的状态种子。
https://stackoverflow.com/questions/24504258
复制相似问题