如何从密码学随机RandomNumberGenerator获取NextDouble

问题描述 投票:0回答:2

我想要一个加密随机双精度数, 因为

RNGCryptoServiceProvider
在 .NET 6 中已过时 这个问题不相关如何生成 0 和 1 之间的加密安全双精度数?

推荐使用

RandomNumberGenerator
,那么
RandomNumberGenerator
是否有像
Random.NextDouble
这样返回双精度等于或大于 0.0 且小于 1.0 的方法?

c# .net random cryptography rngcryptoserviceprovider
2个回答
0
投票

适用于 .NET 6 及更高版本

using System.Security.Cryptography;

static double NextDouble()
{
    ulong nextULong = BitConverter.ToUInt64(RandomNumberGenerator.GetBytes(sizeof(ulong)));

    return (nextULong >> 11) * (1.0 / (1ul << 53));
}

例如

double randomDobule = NextDouble();
Console.WriteLine(randomDobule);

// 0.9007393363493708

0
投票

此处的正确答案可以轻松地根据最初问题中注明的正确答案进行改编(请参阅此处)

byte[] bytes = RandomNumberGenerator.GetBytes(8);
// bit-shift 11 and 53 based on double's mantissa bits
ulong ul = BitConverter.ToUInt64(bytes, 0) / (1 << 11);
double d = (double)ul / (double)(1UL << 53);
© www.soinside.com 2019 - 2024. All rights reserved.