首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >混洗以覆盖所有可能的排列

混洗以覆盖所有可能的排列
EN

Stack Overflow用户
提问于 2014-07-01 15:03:07
回答 2查看 222关注 0票数 3

.NET框架中的Random对象采用32位整数作为种子。这意味着任何使用Random对象的混洗算法都被限制为(最多)40亿次可能的混洗(假设混洗是根据随机序列确定的,我无法想象为什么不是这样)。这意味着,一旦集合超过13个元素,就可以保证混洗不会覆盖所有可能的排列。随着集合大小进一步远离这个大小,混洗所覆盖的可能排列的子集变得越来越不重要。

40亿是一个(主观上)很大的数字,但是如果你生成一个集合的多个“随机”排列,重复的可能性就会比它应该的大得多(特别是当你考虑生日悖论/鸽洞原理时)。

有没有什么简单的方法可以不让我实现自己的随机数生成器?

EN

回答 2

Stack Overflow用户

发布于 2014-07-01 16:16:42

我不推荐创建您自己的随机数生成器(RNG)。他们背后的理论是相当坚实的。如果你需要一些“更随机”的东西,那么你需要使用一个加密的安全RNG。要使用.Net框架提供的默认生成器:

使用System.Security.Cryptography;

var生成器= RandomNumberGenerator.Create();

您可以使用它来获取一些随机字节,您可以将这些字节转换为int或其他值类型。

票数 1
EN

Stack Overflow用户

发布于 2014-07-01 22:07:09

您可以使用C#的免费ports of Mersenne Twister之一。MT19937有一个19937位的状态空间,虽然您可以选择用单个int作为种子,但是如果您有合适的熵源提供给它,也可以使用完整的状态种子。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24504258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档