首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 生成 100 個和為 100 的隨機數:比例縮放法實現

     編輯:程式設計綜合問答

問題分析

需生成 100 個隨機數,滿足:

  • 所有數之和精確等於 100
  • 分布盡可能隨機、均勻
  • 每個數 > 0(通常隱含要求)

核心算法:生成後比例縮放

  1. 生成 100 個隨機正數(如 0~1 之間的 double)
  2. 計算其總和 sum
  3. 每個數乘以 100 / sum,即可保證總和為 100

完整 C# 實現

public 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}");

進階方案:Dirichlet 分布(更均勻)

若需統計學上更「隨機」的分布,可使用 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
  • 繪製直方圖觀察分布形狀
  • 檢查極值是否合理(避免單個數佔據絕大多數)

應用場景

資源分配、概率模擬、負載測試權重生成、投資組合隨機化等。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved