Board logo

標題: 困難題 求高手相助!!!! [打印本頁]

作者: zheng211016    時間: 2018-2-13 22:23     標題: 困難題 求高手相助!!!!

如何 依平均值&上限&下限 產生一組數值?
假如 一組為21個數值
頭痛了很久還是想不出來 用vba可以解決也可以 :D
[attach]28371[/attach]
[attach]28372[/attach]
作者: hcm19522    時間: 2018-2-14 12:19

http://blog.xuite.net/hcm19522/twblog/565439541
作者: jackyq    時間: 2018-2-14 13:26

本帖最後由 jackyq 於 2018-2-14 13:31 編輯

Sub 最簡單法___________________()

'組數過大時, 運算會極度耗時

  平均值 = [A2]
    上限 = [B2]
    下限 = [C2]
    組數 = [D2]

  Randomize
  
  Do
    Value_Sum = 0
    For w = 1 To (組數 - 1)
        Value = Rnd * (上限 - 下限) + 下限
        Value_Sum = Value_Sum + Value
        Range("G" & w) = Value
    Next
    殘值 = 平均值 * 組數 - Value_Sum
    循環次數 = 循環次數 + 1
   
  Loop Until 殘值 >= 下限 And 殘值 <= 上限
  Range("G" & w) = 殘值
  Debug.Print 循環次數
End Sub
作者: jackyq    時間: 2018-2-14 13:28

本帖最後由 jackyq 於 2018-2-14 13:32 編輯

Sub 最小循環___________________()

  平均值 = [A2]
    上限 = [B2]
    下限 = [C2]
    組數 = [D2]

  Randomize
   
  For w = 1 To (組數 - 1)
      Value = Rnd * (上限 - 下限) + 下限
      Value_Sum = Value_Sum + Value
      Range("G" & w) = Value
  Next
  Value = 平均值 * 組數 - Value_Sum
  If Value < 下限 Then
     殘值 = Value - 下限
     Value = 下限
  End If
  If Value > 上限 Then
     殘值 = Value - 上限
     Value = 上限
  End If
  Range("G" & w) = Value
        
  If 殘值 = 0 Then Exit Sub

  Do
  For w = 1 To 組數
        value_try = Range("G" & w) + (殘值 / 組數)
     If value_try >= 下限 And value_try <= 上限 Then
        Range("G" & w) = value_try
        alls = alls + 1
     If alls >= 組數 Then Exit Do
     End If
  Next
  Loop
   
End Sub
作者: zheng211016    時間: 2018-2-14 20:32

非常感謝  jackyq 大大
兩個方法都很棒 謝謝您
作者: zheng211016    時間: 2018-2-14 23:04

回復 2# hcm19522

感謝 hcm19522大 回復
我會找時間弄懂你的函數用法的 謝謝!!!
作者: zheng211016    時間: 2018-2-14 23:32

本帖最後由 zheng211016 於 2018-2-14 23:34 編輯

給想學得人 參考:D
Sub 最簡單法___________________()

'組數過大時, 運算會極度耗時

  平均值 = [A2]
    上限 = [B2]
    下限 = [C2]
    組數 = [D2]

  Randomize                         '重置亂數
   '----------------------------Do 迴圈------------------------------------
  Do
    Value_Sum = 0
    For w = 1 To (組數 - 1)                            'for 迴圈(假如 組數21 只會跑20次)
   
        Value = Rnd * (上限 - 下限) + 下限      'Value = 亂數產生上下限之中的值
        Value_Sum = Value_Sum + Value      'Value_Sum = 把迴圈內所有Value加起來
        Range("G" & w) = Value                      '把產生的值放入儲存格內 / w = 為迴圈數
   
    Next                                                                'for 迴圈 執行到完 就可以到下一行
    殘值 = 平均值 * 組數 - Value_Sum          '殘值 = 平均值 * 組數 - 迴圈內所有的Value總和
    循環次數 = 循環次數 + 1                            '累加 Do迴圈次數
   
  Loop Until 殘值 >= 下限 And 殘值 <= 上限  '直到 殘值 >= 下限 + 殘值 <= 上限
    '------------------------結束迴圈(達成上述條件)------------------------
  Range("G" & w) = 殘值                                     '殘值放入儲存格內(也就是最後一格)
  Debug.Print 循環次數                                       '用於立即視窗顯示 Do循環次數
End Sub




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)