更新:我想要从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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?