我想添加一種類型的已知值雙的一組紋波。我指出,因爲Random.Next/Random.NextDouble()行爲不同。在給定值附近得到一個隨機的異常
我該如何最好地完成這項任務?
設說我有陣列中20個值,其被平均上量40,總的800
List<double> arr = new List<double>() { 40, 40, 40, 40 ..... };
20個值,使之更容易。
經過這種方法,我想整體總計仍然保持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];
允許上次生成的值不重疊。另外,列表只包含兩個值時是一個例外。 qty=1
可能看起來很神奇,但它指的是對象bArray在實際中的樣子。無論如何,我認爲整個想法很清楚。
你能隨機擾動只是第N-1的值,然後進行最後的值所需的值,使總出來800? – mellamokb 2012-04-16 16:56:35
@mellamokb,聽起來像它會不成比例地歪曲最後的價值。 – 2012-04-16 17:01:27
@ Dr.Wily'sApprentice:的確如此,我測試了:)另一個想法:擾亂所有的值,然後攤開它是所有號碼中關閉的數量。 – mellamokb 2012-04-16 17:02:54