指定总和及范围随机凑数

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

 

posted @ 2022-11-22 08:55  依云科技  阅读(56)  评论(0)    收藏  举报