更新:我想要从float.Minvalue到float.Maxvalue的随机浮点数。 我在一些数学方法的单元测试中使用这些数字。
c# random floating-point
KrisTrip asked 2020-01-21T10:48:33Z
7个解决方案
63 votes
最佳方法,没有疯狂的值,相对于浮点数线上的可表示间隔分布(相对于连续数线而言,“统一”被删除是绝对不均匀的):
static float NextFloat(Random random)
{
double mantissa = (random.NextDouble() * 2.0) - 1.0;
// choose -149 instead of -126 to also generate subnormal floats (*)
double exponent = Math.Pow(2.0, random.Next(-126, 128));
return (float)(mantissa * exponent);
}
(*)...检查此处是否有不正常的浮标
警告:也会产生正无穷大! 为安全起见,请选择127的指数。
另一种方法将为您提供一些疯狂的值(位模式的均匀分布),这可能对模糊测试很有用:
static float NextFloat(Random random)
{
var buffer = new byte[4];
random.NextBytes(buffer);
return BitConverter.ToSingle(buffer,0);
}
此版本比以前的版本有所改进,它不会创建“疯狂的”值(无穷大也没有NaN),并且速度仍然很快(也就浮点数行上的可表示间隔进行了分布):
public static float Generate(Random prng)
{
var sign = prng.Next(2);
var exponent = prng.Next((1
关注
打赏