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