我一直在寻找用于计算的有效方法b(说a = 2和b = 50).为了开始,我决定看一下Math.Pow()函数的实现.但在.NET Reflector中,我发现的只有:
[MethodImpl(MethodImplOptions.InternalCall), SecuritySafeCritical]
public static extern double Pow(double x, double y);
Run Code Online (Sandbox Code Playgroud)
当我调用Math.Pow()函数时,我可以看到内部发生了什么的一些资源?
根据我对标准的阅读,random_device::entropy()如果使用软件引擎,则应返回0.0.但是,在VS2010中,它返回32.0,这在我的理解中要求硬件产生非确定性随机数.
VS2010如何random_device生成数字序列?
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个不同的Bridge交易,这就分散了主要问题.我将随机数发生器替换为Stephen Taub和Shawn Farkas在MSDN杂志上发布的那个
用于生成加密安全随机数的代码,范围为1-52,1-51,依此类推,最高可达1-2,取自本网站
/// <summary>
/// Returns a random number within a specified range.
/// </summary>
/// <returns>
/// A 32-bit signed integer greater than or equal to <paramref name="minValue"/> and less than <paramref name="maxValue"/>; that is, the range of return …Run Code Online (Sandbox Code Playgroud)