C# 用C语言生成随机浮点数#
如何在C# 用C语言生成随机浮点数#,c#,random,C#,Random,如何在-1和1之间生成100个随机float,主要分布在-0.1到0.1之间(90%的浮点数必须介于-0.1到0.1)。 目前我使用的不是我想要的 for (int counter = 0; counter < 100; counter++) { randomnum = 0f; randomnum = Convert.ToSingle(randomvalues.NextDouble() / 10); storerandomvalues1[counter] = random
-1
和1
之间生成100个随机float
,主要分布在-0.1
到0.1
之间(90%的浮点数必须介于-0.1
到0.1
)。
目前我使用的不是我想要的
for (int counter = 0; counter < 100; counter++)
{
randomnum = 0f;
randomnum = Convert.ToSingle(randomvalues.NextDouble() / 10);
storerandomvalues1[counter] = randomnum;
}
for(int计数器=0;计数器<100;计数器++)
{
randomnum=0f;
randomnum=Convert.ToSingle(randomvalues.NextDouble()/10);
storerandomvalues1[计数器]=随机数;
}
有什么想法吗?试试这个,它应该能用
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()
}
Random rnd=new Random();
用于(整数计数器=0;计数器<100;计数器++)
{
storerandomvalues1[计数器]=(2*rnd.NextDouble())-1;//精确样本()受保护,因此您可以使用NextDouble()
}
这应该行得通。它生成一个随机数来选择你是否在-0.1,0.1范围内,然后生成一个扩展到你想要的实际范围的第二个随机数。您可以只使用一个随机的double
,但这会使代码更容易出错,更难阅读(所有这些都是为了小小的性能改进)
for(变量计数器=0;计数器<100;计数器++)
{
int selector=randomvalues。下一步(10);//0使用log函数,生成介于1和10之间的浮点,然后取结果的以10为基数的对数。然后随机更改符号。正如我在评论中所说,可能的解决方案有无限多。下面是两种可能的解决方案:
平均值为0且标准的正态(也称为高斯)分布
0.06079的偏差将有90%的结果在-0.1和-0.1之间
+0.1,因此生成一个标准法线并将其乘以0.06079。从技术上来说,您应该检查绝对值是否超过1,
但这相当于在16西格玛下获得结果——只是
不会发生的
但是,您可能不喜欢该解决方案,因为它不会跨越
实践中的整个范围。将生成
X
如前一段所述,如果X<-0.1
,则更换
使用统一的(-1,-0.1)替换它。同样,如果X>0.1
,则替换它
使用统一的(0.1,1)
我实现了这两个,生成了100000个值,下面是直方图:
请注意,第5和第95个分位数分别为-0.0998和+0.09971,有效地-0.1和+0.1,在采样误差范围内。您希望在该范围之外有什么样的分布?您希望在-0.1到0.1范围内有均匀分布吗?我们需要更多信息。您有什么问题吗?您想做些什么像正态分布,甚至是每个子范围内的分布?(虽然不是重复的)。您的问题定义不清。有许多不同的分布符合您的要求。这忽略了正态分布的要求“90%的数字在-0.1和0.1之间”不是Sample()
标记为受保护的
?rnd.Sample给出一个介于0和1之间的数字///2*rnd.Sample()给出一个介于0和2之间的数字///2*rnd.Sampe()-1将给出一个介于-1和1之间的数字如果你不想要100个介于0和1之间的数字,我的答案是错误的…所以也许我不理解你的问题,这是可能的,因为我的英语说得不好:-d你建议浮动的分布是什么,因为它似乎没有给出低于0.1的90%的均匀分布。我在想如果不是的话步骤1中生成的随机浮点数均匀分布在1和10之间,然后取对数基数10应导致所有介于1和9之间的值(应为它们的90%)在0和.1之间,而9和10之间的所有值最终都应该在.1和.999999之间-您可能需要稍微调整数字以使其正确对齐,但这个概念应该是可行的。基本上,您需要一个函数,该函数可以将值的均匀分布重塑为具有特定形状的分布你想要的是什么形状,对数是我们想要的形状的反面,1.3的对数基数10已经大于0.1了。
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;
}