7,763
社区成员
发帖
与我相关
我的任务
分享
'create a random number between sngBegin and sngEnd
'with a probability of bytP to lie within sngPB and sngPE
Public Function GetRndNumP(sngBegin As Single, sngEnd As Single, sngPB As Single, sngPE As Single, bytP As Byte) As Single
Dim bytP1 As Byte, bytP2 As Byte
Debug.Assert (sngPB >= sngBegin) And (sngPE >= sngPB) And (sngEnd >= sngPE)
'计算其他区间的概率
bytP1 = ((sngPB - sngBegin) / ((sngEnd - sngBegin) - (sngPE - sngPB))) * (100 - bytP) '[sngBegin, sngPB]
bytP2 = 100 - bytP - bytP1 '[sngPE, sngEnd]
'依据概率投射到相应区间
Select Case GetRandomNum(1, 100)
Case 1 To bytP
GetRndNumP = GetRandomNum(sngPB, sngPE)
Case (bytP + 1) To (bytP + bytP1)
GetRndNumP = GetRandomNum(sngBegin, sngPB)
Case (bytP + bytP1) + 1 To 100
GetRndNumP = GetRandomNum(sngPE, sngEnd)
End Select
End Function
Public Function GetRandomNum(sngBegin As Single, sngEnd As Single) As Single
Randomize
GetRandomNum = (sngEnd - sngBegin) * Rnd + sngBegin
End Function
'create a random number between sngBegin and sngEnd
'with a probability of bytP to lie within sngPB and sngPE
Public Function GetRndNumP(sngBegin As Single, sngEnd As Single, sngPB As Single, sngPE As Single, bytP As Byte) As Single
Dim sngPLen As Single
Dim sngTLen As Single 'total length
Dim sngIncreased As Single '需要缩放的长度
Dim sngResult As Single
sngPLen = sngPE - sngPB
sngTLen = sngEnd - sngBegin
Debug.Assert (sngPB >= sngBegin) And (sngPE >= sngPB) And (sngEnd >= sngPE)
Debug.Assert (bytP < 100) And (bytP > 0)
Debug.Assert sngTLen <> sngPLen
'映射原来的区间为等权重区间
If (sngPLen / sngTLen) * 100 = bytP Then
GetRndNumP = GetRandomNum(sngBegin, sngEnd)
Exit Function
End If
'((sngPLen + sngIncreased) / (sngTLen + sngIncreased)) * 100 = bytP
sngIncreased = ((bytP / 100) * sngTLen - sngPLen) / (1 - (bytP / 100))
'缩放回原来区间
sngResult = GetRandomNum(sngBegin, sngEnd + sngIncreased)
Select Case sngResult
Case sngBegin To sngPB
GetRndNumP = sngResult
Case sngPB To (sngPE + sngIncreased) '等比例缩放
GetRndNumP = sngPB + (sngResult - sngPB) * sngPLen / (sngPLen + sngIncreased)
Case (sngPE + sngIncreased) To sngEnd + sngIncreased '简单平移
GetRndNumP = sngResult - sngIncreased
End Select
End Function
'层次越深 节点越多,基础节点也越多
Select Case bytCurLevel
Case 1
bytNodeCount = GetRandomNum(5, 15)
bytPBasic = 33
Case 2
bytNodeCount = GetRandomNum(1, 20)
bytPBasic = 33
Case Is >= 3
bytNodeCount = GetRndNumP(1, 100, 20, 100, bytCurLevel * 10)
bytPBasic = IIf(((bytCurLevel * 10) + 50) > 99, 99, ((bytCurLevel * 10) + 50))
End Select