double型の既知の値の配列に一種のリップルを追加したいと思います。Random.Next / Random.NextDouble()の動作が異なるため、この点を指摘します。
このタスクを最もよく達成するにはどうすればよいですか?
配列に
List<double> arr = new List<double>() { 40, 40, 40, 40 ..... };
20個の値があり、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%)。
[アップデート]
この質問への回答に基づいて、更新を加えて質問を追加します。
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];
最後に生成された値が重ならないように考慮されています。さらに、リストに2つの値しか含まれていない場合の例外。は魔法のqty=1
ように見えるかもしれませんが、オブジェクトbArrayが実際にどのように見えるかを示しています。とにかく全体の考えは明確だと思います。