指定总和及范围随机凑数
Sub test() For i = 1 To 20 Debug.Print f(50, 10, 30, 3, 2) Next End Sub Rem sum_target 目标总和 Rem low 下限 Rem high 上限 Rem count_comb 组合个数 Rem decimal_digits 小数位数 Rem count_while 循环次数 Function f(sum_target, low, high, count_comb, decimal_digits, Optional count_while = 10000) Application.Volatile sum_target = sum_target * 10 ^ decimal_digits low = low * 10 ^ decimal_digits high = high * 10 ^ decimal_digits val_average& = Int(sum_target / count_comb) If val_average < low Or val_average > high Then f = "Average Err !": Exit Function ReDim ar_res&(count_comb - 1) For i = 1 To count_comb - 1 ar_res(i) = val_average Next ar_res(0) = sum_target - val_average * (count_comb - 1) Randomize For i = 1 To count_while r1 = Int(Rnd * count_comb) r2 = Int(Rnd * count_comb) If Rnd < 0.5 Then p = high - ar_res(r2) q = ar_res(r1) - low If p < q Then t = p Else t = q t = Int(Rnd * t) ar_res(r1) = ar_res(r1) - t ar_res(r2) = ar_res(r2) + t Else p = high - ar_res(r1) q = ar_res(r2) - low If p < q Then t = p Else t = q t = Int(Rnd * t) ar_res(r1) = ar_res(r1) + t ar_res(r2) = ar_res(r2) - t End If Next For i = 0 To count_comb - 1 s = s & "+" & ar_res(i) * 10 ^ -decimal_digits Next f = sum_target * 10 ^ -decimal_digits & "=" & Mid(s, 2) End Function