需生成 100 個隨機數,滿足:
double)sum100 / sum,即可保證總和為 100public static double[] GenerateRandomNumbersWithFixedSum(int count, double targetSum) {
if (count <= 0) throw new ArgumentException("Count must be positive");
Random rand = new Random();
double[] numbers = new double[count];
double sum = 0;
// 1. 生成隨機數
for (int i = 0; i < count; i++) {
// 使用 NextDouble() 產生 0.0 ~ 1.0,避免 0 導致後續除零
numbers[i] = rand.NextDouble() + 0.0001;
sum += numbers[i];
}
// 2. 比例縮放
double factor = targetSum / sum;
for (int i = 0; i < count; i++) {
numbers[i] *= factor;
}
// 3. 修正浮點誤差(可選)
double actualSum = numbers.Sum();
double diff = targetSum - actualSum;
numbers[0] += diff; // 將誤差加到第一個元素
return numbers;
}
// 使用示例
var result = GenerateRandomNumbersWithFixedSum(100, 100);
Console.WriteLine($"Sum: {result.Sum():F10}"); // 輸出 100.0000000000
Console.WriteLine($"Min: {result.Min():F4}, Max: {result.Max():F4}, Avg: {result.Average():F4}");
若需統計學上更「隨機」的分布,可使用 Gamma 分布生成 Dirichlet 樣本:
public static double[] DirichletSample(int count, double targetSum) {
Random rand = new Random();
double[] samples = new double[count];
double sum = 0;
for (int i = 0; i < count; i++) {
// Gamma(1,1) 即指數分布,可用 -ln(U) 模擬
samples[i] = -Math.Log(rand.NextDouble());
sum += samples[i];
}
double factor = targetSum / sum;
for (int i = 0; i < count; i++) {
samples[i] *= factor;
}
return samples;
}
Sum() 是否恆為 100資源分配、概率模擬、負載測試權重生成、投資組合隨機化等。