excel随机函数出来的数相加等于一个想要的固定值 比如 产生20个随机数想加等于200而且每个数都不大于3

最好用VBA 错了 相加总数是50

Option Explicit

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

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-09-16
这是不可能的,20个数加起来等于200 那么平均数是10 你又说每个数不大于3 那加起来肯定小于60
第2个回答  2011-09-17
不对吧,按题意,假如每个数都等于3,那20个3等于60,用于到不了200的
第3个回答  2011-09-20
20个不大于3的数值会等于200吗?数学真好。

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网