我想在double类型的已知值数组中添加一种波纹。我指出这一点是因为 Random.Next / Random.NextDouble() 表现不同。
我怎样才能最好地完成这项任务?
假设我在数组中有 20 个值,
List<double> arr = new List<double>() { 40, 40, 40, 40 ..... };
20 个值是 40 的平均值,总共 800,以使其更容易。
采用这种方法后,我希望总和仍然保持 800,但每个单独的值都应该修改。这些值应该是正数,因为它们是total+=i
在之后添加的。
到目前为止,这个问题是使用给定数量的值的百分比来解决的。
1.0 / 20 = 0.05, then multiplicate that with the total and the iteration number. Then subtract the result from the remainder. Finally i just return a sort by new Guid()
.
正如您已经看到的那样,这种方法只是有点棒,而只有大约 5-20 个值。在我今天的例子中,这个数组需要支持 500-2000 个值(每个值 0,2-0,05%)。
相反,我想有一个衍生物或类似的东西,它会以 +-x% 的值 40 为基础进行失真。或者,也许更好,在数组中的任何单个值上 +-x%)。
[更新]
我将根据对此问题的回复添加更新的问题。
Random rnd = new Random();
List<double> ripple = new List<double>();
int qty = bArray.Count();
double diff = last.Value - first.Value;
if (qty == 1)
{
double linearAvg = (diff / qty) / 2;
ripple.Add(linearAvg);
}
else
{
double[] rndarr = new double[qty];
for (int i = 0; i < qty; i++)
rndarr[i] = rnd.NextDouble();
double rndArrSum = rndarr.Sum();
for (int i = 0; i < qty; i++)
rndarr[i] /= rndArrSum;
for (int i = 0; i < qty; i++)
ripple.Add(diff * rndarr[i]);
}
double valueOverall = first.Value;
for (int i = (qty > 1) ? 1 : 0; i < qty; i++)
valueOverall += ripple[i];
已考虑到最后生成的值不重叠。另外,当列表只包含两个值时例外。可能看起来很神奇,但它指的qty=1
是对象 bArray 的实际外观。无论如何,我认为整个想法很清楚。