我想要一个加密随机双精度数, 因为
RNGCryptoServiceProvider
在 .NET 6 中已过时
这个问题不相关如何生成 0 和 1 之间的加密安全双精度数?
推荐使用 RandomNumberGenerator
,那么 RandomNumberGenerator
是否有像 Random.NextDouble
这样返回双精度等于或大于 0.0 且小于 1.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
此处的正确答案可以轻松地根据最初问题中注明的正确答案进行改编(请参阅此处)。
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);