Ind*_*ent 1 c# arrays algorithm math
我想在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%).
相反,我希望有一个衍生物或类似物,以40的+ -x%为基础进行失真.或者,甚至可能更好,+ -x%对阵列中的任何单个值).
[UPDATE]
我将根据对此问题的回复添加更新问题.
    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看起来像真实.无论如何,我认为整个想法都很清楚.
一种方法是生成0到1之间的N个随机数(不包括).总结一下.然后将每个数字除以总和.您现在有一个N个随机数的列表,总和为1.现在,将每个数字乘以您想要的总和,得到将进入最终数组的数字.
如果您希望您的值为+/-某个百分比,则使用Random.Next生成某个范围内的随机数并求它们.然后除以总数得到总和为1的数字列表.最后一步是相同的.