我知道如何使用伪随机数生成器的
NextDouble方法生成0到1之间的随机数.
var rng1 = new System.Random(); var random1 = rng1.NextDouble(); // generates a random double between 0 and 1.0
而且我知道如何使用密码安全的随机数生成器来填充随机字节数组.
Byte[] bytes = new Byte[8]; var rng2 = new System.Security.Cryptography.RNGCryptoServiceProvider(); rng2.GetBytes(bytes); // generates 8 random bytes
但是,如何将RNGCryptoServiceProvider的字节数组输出转换为均匀分布在0(含)和1(独占)之间的随机数?
解决方法
在我看来,迄今为止的解决方案由于取而代之的是分布不均.为了平均分配,我想你想要这样的东西.
// Step 1: fill an array with 8 random bytes var rng = new RNGCryptoServiceProvider(); var bytes = new Byte[8]; rng.GetBytes(bytes); // Step 2: bit-shift 11 and 53 based on double's mantissa bits var ul = BitConverter.ToUInt64(bytes,0) / (1 << 11); Double d = ul / (Double)(1UL << 53);
请注意,您不能将UInt64分为UInt64.MaxValue,因为双精度不足,无法为所有输入获取唯一的输出.所以你可以/必须抛出一点点.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。