如何使用RNGCryptoServiceProvider生成Bridge手牌?Bridge的游戏使用52张不同的扑克牌进行,这些牌随机分配给四名玩家,每名玩家最终得到13张牌:即所谓的“发牌”。大约少于2^96个桥交易是可能的。在本文档中,对程序生成随机交易的要求如下:软件应该能够生成所有可能的桥接协议,这也可以通过人工处理来实现。该软件应该以相同的概率生成每笔交易,而不管棋盘号码、前手牌或任何其他情况。预测交易是不可能的,即使在会议中看到了所有其他交易之后。文章接着指出,伪随机生成器不能用于生成交易,因为看到伪随机序列的第一个元素就可以计算出使用的种子,从而使黑客能够预测接下来会发生哪些交易。此外,由于大多数伪随机生成器采用32位种子,因此应该遵循这些生成器将能够生成最多2^32个不同的桥交易而不是所需的2^96个,并遵循所谓的生日悖论,经过2^32笔交易的平方根后,可能会产生相同的交易。描述Bridge交易生成应用程序要求的文档的作者编写了一个程序,该程序在全球范围内用于生成随机交易,使用键盘上的人工输入来生成96位种子。十四年来,这种方法没有显示出任何缺陷。我想编写一个例程,放弃使用人工输入来生成所需种子的需要。来自RNGCryptoServiceProvider。我使用下面的代码生成随机数,首先在1到52范围内,然后在1到51范围内,依此类推,直到剩下一张牌。测试由此产生的交易我非常有信心这段代码将以相同的概率产生任何交易能力,并且任何一张牌最终落入四名玩家之一的机会等于0.25。但是由于我不知道RNGCryptoServiceProvider中使用的种子的强度,我想知道:这段代码是否能够或可以适应生成2^96个不同的事务。此代码的下一个事务是不可预测的。编辑这个问题前面提到的获取随机数的方法是有缺陷的。如果此代码能够生成2^96种不同的Bridge交易,那就会分散主要问题的注意力。我用随机数生成器替换了StephenTaub和ShawnFarkas在MSDN杂志中发布的用于生成1-52、1-51等范围内的加密安全随机数(最多1-2)的代码,取自此website//////返回指定范围内的随机数。/////////大于或等于且小于的32位有符号整数;即返回值范围包括但不包括。如果等于,则返回。//////返回的随机数的下限。///返回的随机数的唯一上限。必须大于或等于。//大于.publicoverrideInt32Next(Int32minValue,Int32maxValue){if(minValue>maxValue)thrownewArgumentOutOfRangeException("minValue");}如果(最小值==最大值)返回最小值;Int64diff=maxValue-minValue;while(true){//cryptoProvider是RNGCryptoServiceProvider类型。cryptoProvider.GetBytes(uint32Buffer);//uint32Buffer的大小为4个字节。UInt32rand=BitConverter.ToUInt32(uint32Buffer,0);Int64最大值=(1+(Int64)UInt32.MaxValue);Int64余数=最大%diff;如果(rand
