对你说 的新问题我还不是很理解,但是我做了一个VBA的,我想VBA更容易达到细致的目的
Option Explicit
Function 随机数对(数值 As Variant, Optional 波动 As Variant = 0.0002, Optional 修约位数 As Variant = 4) As Variant
Dim arr(1 To 2) As Double, arrTmp(1 To 2) As Double
Dim upperboundA As Double, lowerboundA As Double, upperboundB As Double, lowerboundB As Double
Dim s As String
Application.Volatile
upperboundA = 数值 + 波动
lowerboundA = 数值 - 波动
arr(1) = RndBetween(lowerboundA, upperboundA)
If Mid(Split(数值, ".")(1), 修约位数, 1) Mod 2 = 0 Then
lowerboundB = 数值 - 5 * 10 ^ (-修约位数 - 1)
upperboundB = 数值 + 5 * 10 ^ (-修约位数 - 1)
Else
lowerboundB = 数值 - 4 * 10 ^ (-修约位数 - 1)
upperboundB = 数值 + 4 * 10 ^ (-修约位数 - 1)
End If
lowerboundB = Application.WorksheetFunction.Max(2 * lowerboundB - arr(1), lowerboundA)
upperboundB = Application.WorksheetFunction.Min(2 * upperboundB - arr(1), upperboundA)
arr(2) = RndBetween(lowerboundB, upperboundB)
随机数对 = Application.WorksheetFunction.Transpose(arr)
End Function
' 功能:产生两个数值间(含)的随机数
Function RndBetween(FromValue As Double, ToValue As Double) As Double
Dim dblDiff As Double
Dim NumDigitsAfterDecimal As Long
Dim upperbound As Long, lowerbound As Long
NumDigitsAfterDecimal = Application.Max(Len(Split(FromValue, ".")(1)), Len(Split(ToValue, ".")(1)))
dblDiff = Round(ToValue - FromValue, NumDigitsAfterDecimal)
NumDigitsAfterDecimal = Len(Split(dblDiff, ".")(1))
Debug.Print FromValue, ToValue, NumDigitsAfterDecimal
lowerbound = 0
upperbound = dblDiff * 10 ^ NumDigitsAfterDecimal
Randomize
RndBetween = FromValue + Int((upperbound - lowerbound + 1) * Rnd + lowerbound) * 10 ^ (-NumDigitsAfterDecimal)
End Function |