如何在float
和-1
之间生成100个1
-0.1
,主要分布在0.1
到-0.1
之间(90%的浮点数必须介于0.1
到for (int counter = 0; counter < 100; counter++)
{
randomnum = 0f;
randomnum = Convert.ToSingle(randomvalues.NextDouble() / 10);
storerandomvalues1[counter] = randomnum;
}
)。
目前我使用的并不是我想要的
{{1}}
有什么想法吗?
答案 0 :(得分:3)
这应该有效。它生成一个随机数,以选择您是否在-0.1,0.1范围内,然后是第二个扩展到您想要的实际范围。您可以只使用一个随机double
,但是会让代码更容易错误,并且更难阅读(所有这些都是为了提高性能)。
for (var counter = 0; counter < 100; counter++)
{
int selector = randomvalues.Next(10); // 0 <= selector < 10
double randomnum;
if (selector < 9)
{
randomnum = randomvalues.NextDouble() * 0.2 - 0.1;
}
else
{
randomnum = randomvalues.NextDouble() * 1.8 - 0.9;
randomnum += Math.Sign(randomnum) * 0.1;
}
storerandomvalues1[counter] = (float)randomnum;
}
答案 1 :(得分:0)
正如我在评论中所说,有无数可能的解决方案。以下是两种可能的解决方案:
正态(又名高斯)分布,均值为0且为标准 偏差为0.06079,其结果的90%在-0.1和之间 +0.1,因此生成标准法线并将其乘以0.06079。从技术上讲,你应该检查绝对值是否超过1, 但这相当于在16西格玛获得结果 - 这只是 不会发生。
但是,您可能不喜欢解决方案,因为不会跨度
实践中的整个范围。将要生成的变体
如前一段所述X
,如果X < -0.1
,则替换
它带有制服(-1,-0.1)。同样,如果X > 0.1
,请替换它
制服(0.1,1)。
我实现了这两个,生成了100,000个值,这里是直方图:
请注意,5 th 和95 th 分位数分别为-0.0998和+0.09971,在采样误差范围内有效-0.1和+0.1。
答案 2 :(得分:-1)
使用log函数,生成1到10之间的浮点数,然后取结果的log 10。然后随机改变标志。
答案 3 :(得分:-3)
试试这个,它应该有用......
Random rnd = new Random();
for (int counter = 0; counter < 100; counter++)
{
storerandomvalues1[counter]=(2*rnd.NextDouble())-1; // Exact Sample() is protected so u can use NextDouble()
}