最好用VBA 错了 相加总数是50
Function getRandom(total As Integer, max As Integer, num As Integer) As Boolean
'total是最后要得到的总和,max是最大不能超过的数,num是产生多少个随机数
Dim ranNum As Single '随机数
Dim leftNum As Single '剩余数
Dim conNumTotal As Single '确定的剩余数
Dim i As Integer
'判断条件是否满足
getRandom = True
If max * num < total Then
'根本就不可能满足条件,直接退出
getRandom = False
Exit Function
End If
conNumTotal = 0
For i = 1 To num - 1 Step 1
DoEvents
Randomize '随机化
'很显然地所有的ranNum都满足小于max的条件
ranNum = Rnd() * max '产生随机数
'判断当前数据的合理性
leftNum = total - conNumTotal - ranNum
If max * (num - i) < leftNum Then
'无法满足基本要求,退回序列
i = i - 1
Else
'满足要求,继续
conNumTotal = conNumTotal + ranNum
Debug.Print ranNum
End If
'自行处理产生的ranNum
Next i
'最后一个随机数
ranNum = total - conNumTotal
Debug.Print ranNum
debug.print "over"
'由于最后一个数
End Function
Sub a()
getRandom 200, 11, 20
End Sub追问
怎么产生不了数据
追答'判断条件是否满足
getRandom = True
If max * num < total Then
'根本就不可能满足条件,直接退出
getRandom = False
Exit Function
End If
你分别传入200 3 20
这就的确是无法产生数据的,3*20=60,怎么也不可能实现要求
上面列出的代码就是判断这种非常无理的请求的……
你用50的话就使用
Sub a()
getRandom 50, 11, 20
End Sub
……你不会是说你不知道在什么地方看debug.print出来的数据吧?
如果这样的话你把第一个
Debug.Print ranNum
改成:
thisworkbook.worksheets(1).range("A" & i).formular1c1=rannum
把最后一个
Debug.Print ranNum
改成:
thisworkbook.worksheets(1).range("A" & i).formular1c1=rannum
为什改成50还是出不来数呢
追答立即窗口里面有没有数?
还是什么都没有打出来?
If max * num < total Then
'根本就不可能满足条件,直接退出
getRandom = False
Exit Function
End If
新加一句:
If max * num < total Then
'根本就不可能满足条件,直接退出
getRandom = False
debug.print "not match exit function" //这句
Exit Function
End If