加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何在0和1之间生成加密安全的双精度?

发布时间:2020-12-15 03:45:40 所属栏目:百科 来源:网络整理
导读:我知道如何使用伪随机数生成器的 NextDouble方法生成0到1之间的随机数. var rng1 = new System.Random();var random1 = rng1.NextDouble(); // generates a random double between 0 and 1.0 而且我知道如何使用密码安全的随机数生成器来填充随机字节数组. B
我知道如何使用伪随机数生成器的 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,因为双精度不足,无法为所有输入获取唯一的输出.所以你可以/必须抛出一点点.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读