Tag: rngcryptoserviceprovider

如何使用RNGCryptoServiceProvider生成Bridge手?

Bridge的游戏是用52种不同的扑克牌进行的,这些扑克牌随机分布在四个玩家中,每个玩家最终得到13张牌:一个所谓的“交易”。 大约只有不到2 ^ 96的Bridge交易是可能的 。 在本文档中,生成随机交易的程序的要求描述如下: 该软件应该能够生成所有可能的桥接协议,因为这也可以通过手动处理实现。 软件应该以相同的概率生成每笔交易,而不受董事会编号,之前的手或任何其他情况的影响。 即使在会议中看到所有其他交易之后,也无法预测交易。 本文继续说明伪随机生成器不能用于生成交易,因为看到伪随机序列的第一个元素将使得计算所使用的种子成为可能,从而使黑客能够预测将要跟随的交易。 此外,由于大多数伪随机生成器采用32位的种子,因此应该遵循这些生成器将能够产生最多2 ^ 32个不同的桥接交易,而不是所需的2 ^ 96,并且遵循所谓的生日悖论 ,在2 ^ 32交易的平方根之后,可能会产生相同的交易。 描述Bridge交易生成应用程序要求的文档的作者编写了一个程序,在世界范围内用于生成随机交易,使用键盘上的人类输入生成96位种子。 十四年来,这种方法没有出现任何缺陷。 我想编写一个例程,放弃使用人工输入来生成所需种子的需要。 来自RNGCryptoServiceProvider 。 我使用下面的代码来生成随机数,首先在1到52的范围内,然后在1到51的范围内,依此类推,直到剩下一张卡。 测试得到的交易我非常有信心这个代码能够以相同的概率产生任何交易能力,并且任何一张卡最终与四个玩家之一的机会等于0.25。 但由于我不知道RNGCryptoServiceProvider中使用的种子的强度,我想知道是否: 此代码将能够或可以适应生成2 ^ 96个不同的交易。 这段代码的下一笔交易不可预测。 编辑获得此问题中先前提到的随机数的方法存在缺陷。 如果这个代码能够产生2 ^ 96个不同的Bridge交易,这就分散了主要问题。 我用随机数字生成器替换了Stephen Taub和Shawn Farkas在MSDN杂志上发布的那个 用于生成加密安全随机数的代码,范围为1-52,1-51,依此类推,最高可达1-2,取自本网站 /// /// Returns a random number within a specified range. /// /// /// A 32-bit signed integer […]

这种生成随机数的方法有多“好”?

我在google上搜索RNGCryptoServiceProvider,其中包含如何限制Max和Min之间范围的示例,并且仍能获得均匀分布。 在我使用模运算符之前,但有时我得到奇怪的值(高于Max)…无论如何这个代码(信用到未知)种子随机使用来自RNGCCryptoServiceProvider的新种子,每次调用该方法。 你们有什么感想? public static int GetRandom(int min, int max) { byte[] b = new byte[sizeof(int)]; new System.Security.Cryptography.RNGCryptoServiceProvider().GetBytes(b); int i = BitConverter.ToInt32(b, 0); Random r = new Random(i); return r.Next(min, max); }