假如我要从148541.54至120.41之间取50个随机数,他们平均值等于59547.67,请问这50个随机数要怎么求,能不能给个公式。
解决方案 »
- 如何将字节数组转换成字符
- Word如何一次撤销一个宏的全部操作?
- 菜鸟求助
- 请问如何将adoRS的每条记录赋值到MSFLEXGRID的每行里?
- 多个表连接查询是不是不支持LIKE查询
- 如何控制或操作EXCEL图表???在线等待,急……
- 请问各位大侠,请教几个问题,加注释给代码
- 新手刚来,请多多关照-------散分
- 在一form中我有一MSHFlexGrid1控件,怎样写代码在实行时,鼠标可以自由拖动MSHFlexGrid1?急
- 诸位大侠,小弟有一事求教(关于msflexgrid控件的)。请高抬贵手,感激不尽!!!
- VB6中如何模糊查找目录名?
- [求助]谁能拖动无标题样的椭圆形的EXCEL工作表?(附图)
绝对随机不太可能了,干预一下是可以的,综合上面大家的思路,给你个算法:
Option Explicit
'假如我要从148541.54至120.41之间取50个随机数,他们平均值等于59547.67,请问这50个随机数要怎么求,能不能给个公式。Private Const MAXVALUE As Currency = 148541.54
Private Const MINVALUE As Currency = 120.41
Private Const AVGVALUE As Currency = 59547.67
Private Const NUM = 50Private Sub Command1_Click() Dim r As Currency
Dim i As Long
Dim arr(NUM - 1) As Currency '最终结果
Dim maxTmp As Currency, minTmp As Currency
Dim sum As Currency, avg As Currency100
maxTmp = MAXVALUE
minTmp = MINVALUE
sum = 0
avg = 0
Erase arr
Randomize
For i = 1 To NUM - 1 '先求49个
r = (maxTmp - minTmp + 1) * Rnd + minTmp
arr(i - 1) = r
sum = sum + r
avg = sum / i
If avg > AVGVALUE Then
maxTmp = AVGVALUE
minTmp = MINVALUE
ElseIf avg < AVGVALUE Then
maxTmp = MAXVALUE
minTmp = AVGVALUE
Else
maxTmp = MAXVALUE
minTmp = MINVALUE
End If
Next
'人工求最后一个
arr(NUM - 1) = AVGVALUE * NUM - sum
If (arr(NUM - 1) < MINVALUE) Or (arr(NUM - 1) > MAXVALUE) Then GoTo 100 '重新来过
'打乱结果
Dim a() As Currency
a = arr
For i = 0 To NUM - 1
r = Int(((NUM - 1) - i + 1) * Rnd + i)
arr(i) = a(r)
a(r) = a(i)
Next
'验证结果:
sum = 0
avg = 0
For i = 0 To NUM - 1
Debug.Print arr(i);
sum = sum + arr(i)
Next
Debug.Print
Debug.Print CCur(sum / NUM)
End Sub
Private Sub Form_Load()
Dim tValues() As Double
Dim tValues_Length As Long
Dim tValues_Index As Long
Dim tValues_Sum As Long
Randomize Timer
tValues() = NumbersGetByAverage(50, 148541.54, 120.41, 59547.67)
tValues_Length = UBound(tValues())
For tValues_Index = 0 To tValues_Length
tValues_Sum = tValues_Sum + tValues(tValues_Index)
Debug.Print "Value " & tValues_Index & "=" & tValues(tValues_Index)
Next Debug.Print "Average = ", tValues_Sum / 50
End SubFunction NumbersGetByAverage(ByVal pCount As Long, ByVal pValueMax As Double, ByVal pValueMin As Double, ByVal pAverage As Double) As Double()
Dim tOutValues() As Double
Dim tOutValues_AbsSum As Double
Dim tOutValues_Scale As Double
Dim tSurValues() As Double
Dim tSurValues_AbsSum As Double
Dim tValues_Length As Long
Dim tValues_Index As Long
Dim tAbsValue As Double
Dim tAbsAverage As Double
tValues_Length = pCount - 1
ReDim tSurValues(tValues_Length)
ReDim tOutValues(tValues_Length)
For tValues_Index = 0 To tValues_Length
tSurValues(tValues_Index) = Rnd
tSurValues_AbsSum = tSurValues_AbsSum + tSurValues(tValues_Index)
Next
tAbsValue = Abs(pValueMax - pValueMin)
tAbsAverage = pAverage - pValueMin
tOutValues_AbsSum = tAbsAverage * pCount
tOutValues_Scale = tOutValues_AbsSum / tSurValues_AbsSum
'tOutValues_AbsSum = 0 'Test
For tValues_Index = 0 To tValues_Length
tOutValues(tValues_Index) = tSurValues(tValues_Index) * tOutValues_Scale + pValueMin
'tOutValues_AbsSum = tOutValues_AbsSum + tOutValues(tValues_Index) 'Test
Next
'Debug.Print tOutValues_AbsSum / pCount 'Test
NumbersGetByAverage = tOutValues()
End Function
Function NumbersGetByAverage(ByVal pCount As Long, ByVal pValueMax As Double, ByVal pValueMin As Double, ByVal pAverage As Double) As Double()
Dim tOutValues() As Double
Dim tOutValues_AbsSum As Double
Dim tSurValues() As Double
Dim tSurValues_AbsSum As Double
Dim tValues_Length As Long
Dim tValues_Index As Long
Dim tAbsValue As Double
Dim tAbsAverage As Double
tValues_Length = pCount - 1
ReDim tSurValues(tValues_Length)
ReDim tOutValues(tValues_Length)
For tValues_Index = 0 To tValues_Length
tSurValues(tValues_Index) = Rnd
tSurValues_AbsSum = tSurValues_AbsSum + tSurValues(tValues_Index)
Next
tAbsAverage = pAverage - pValueMin
tOutValues_AbsSum = tAbsAverage * pCount
For tValues_Index = 0 To tValues_Length
tOutValues(tValues_Index) = (tSurValues(tValues_Index) * tOutValues_AbsSum) / tSurValues_AbsSum + pValueMin
Next
NumbersGetByAverage = tOutValues()
End Function
然后你根据目的数组的预计平均数A,计算A*N求出预计数组的和D。
则目标数组OA(i)=SA(i)*D/S你要求的形式是从min到max,所以要把它变为OA(i)=SA(i)*D/S+Min的形式。区别仅仅在于:D=(A-Min)*N。