您当前的位置: 首页 > 

Peter_Gao_

暂无认证

  • 0浏览

    0关注

    621博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

C#中生成随机浮点数的最佳方法

Peter_Gao_ 发布时间:2021-09-14 20:10:48 ,浏览量:0

 

更新:我想要从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             
关注
打赏
1664521772
查看更多评论
0.0392s