.NET框架中的Random对象采用32位整数作为种子。这意味着使用Random对象的任何改组算法都限于(最多)40亿次可能的改组(假设随机序列是根据随机序列确定的,我无法想象它为什么不会这样)。这意味着一旦集合超过13个元素,就可以保证shuffle不会覆盖所有可能的排列。随着集合大小从这个大小进一步扩大,shuffle覆盖的可能排列的子集变得越来越无关紧要。
40亿是一个(主观)大数字,但是如果你产生一个集合的多个“随机”排列,重复的可能性就会大得多(特别是当你考虑生日悖论/鸽子原则时)
这有什么简单的方法不涉及我实现我自己的随机数生成器?
答案 0 :(得分:1)
我不建议您创建自己的随机数生成器(RNG)。他们背后的理论非常扎实。如果你需要“更随机”的东西,那么你需要使用加密安全的RNG。要使用.Net框架提供的默认生成器:
使用System.Security.Cryptography;
var generator = RandomNumberGenerator.Create();
您可以使用它来获取一些可以转换为int或其他值类型的随机字节。
答案 1 :(得分:0)
您可以使用免费提供的ports of Mersenne Twister到C#之一。 MT19937有一个19937位的状态空间,虽然你可以选择用一个int来播种它,但如果你有一个合适的熵源可以从中提供完整的状态播种。