Board logo

標題: [發問] 將一固定值隨機分配到指定欄位 [打印本頁]

作者: PaulDing    時間: 2018-8-26 16:55     標題: 將一固定值隨機分配到指定欄位

請教各位大大 , 由於小弟正在做模擬研究遇到了以下的問題 , 請各位大大幫忙指導VBA該如何編寫呢 ? 感恩 .

想要將Project1  Demand的固定值隨機分配到10個SKU中.

[attach]29271[/attach]
作者: n7822123    時間: 2018-8-26 17:12

本帖最後由 n7822123 於 2018-8-26 17:13 編輯

回復 1# PaulDing

隨機分配到10個欄位的合要等於111嗎?
如果能描述清楚一點,或者舉一個範例結果,別人才知道你的需求
作者: hcm19522    時間: 2018-8-26 17:43

http://blog.xuite.net/hcm19522/twblog/585237398
作者: n7822123    時間: 2018-8-26 17:49

本帖最後由 n7822123 於 2018-8-26 18:02 編輯

回復 2# n7822123

隨便做了一個,不知道有沒符合你的需求
[attach]29274[/attach]
  1. Sub test1()
  2. 亂數比例範圍 = 0.3
  3. RN = Sheets(1).UsedRange.Rows.Count
  4. ReDim Sum(RN - 1)
  5. For R = 1 To RN - 1
  6.   Sum(i) = Cells(R + 1, 3)
  7.   ave = Sum(i) / 10
  8.   For C = 1 To 9
  9.     Cells(R + 1, C + 3) = Fix(((Rnd * 2) - 1) * (ave * 亂數比例範圍) + ave)
  10.   Next C
  11.   Cells(R + 1, 13) = "=sum(RC[-9]:RC[-1])"
  12.   Cells(R + 1, 13) = Sum(i) - Cells(R + 1, 13)
  13. Next R
  14. End Sub
複製代碼

作者: n7822123    時間: 2018-8-26 18:22

本帖最後由 n7822123 於 2018-8-26 18:26 編輯

回復 1# PaulDing


剛剛發現你的S.N. 在B欄,修改一下程式碼
如果要用函數做的話 參考 hcm19522 大大即可

[attach]29276[/attach]
  1. Sub test1()
  2. 亂數比例範圍 = 0.3
  3. RN = Sheets(1).UsedRange.Rows.Count
  4. ReDim Sum(RN - 1)
  5. For R = 1 To RN - 1
  6.   Sum(R) = Cells(R + 1, 4)
  7.   ave = Sum(R) / 10
  8.   For C = 1 To 9
  9.     Cells(R + 1, C + 4) = Fix(((Rnd * 2) - 1) * (ave * 亂數比例範圍) + ave)
  10.   Next C
  11.   Cells(R + 1, 14) = "=sum(RC[-9]:RC[-1])"
  12.   Cells(R + 1, 14) = Sum(R) - Cells(R + 1, 14)
  13. Next R
  14. End Sub
複製代碼

作者: PaulDing    時間: 2018-8-27 21:39

回復 2# n7822123

了解了. 下次我會注意的 , 是合要等於原來的111.
作者: PaulDing    時間: 2018-8-27 21:44

hcm19522 發表於 2018-8-26 17:43


謝謝hcm大大的幫忙.
作者: PaulDing    時間: 2018-8-27 21:46

回復  PaulDing


剛剛發現你的S.N. 在B欄,修改一下程式碼
如果要用函數做的話 參考 hcm19522 大大即 ...
n7822123 發表於 2018-8-26 18:22


謝謝n大的幫忙
作者: PaulDing    時間: 2018-8-28 14:33

回復  PaulDing


剛剛發現你的S.N. 在B欄,修改一下程式碼
如果要用函數做的話 參考 hcm19522 大大即 ...
n7822123 發表於 2018-8-26 18:22


n大 , 再與您請較一下"亂數比例範圍 = 0.3"指的是什麼意思呢? 感恩.
作者: n7822123    時間: 2018-8-29 00:13

本帖最後由 n7822123 於 2018-8-29 00:19 編輯

回復 9# PaulDing

只是一個變數值=0.3,數字越大,分配的越不平均

以平均值當中值,在乘以一個比例系數當做公差

假設平均值=10  比例系數=0.3(30%)    相當於 10+/-3

亂數會從7~13 左右的區間跑,再用fix函數取整數

如果比例系數大於1,有可能會跑出負值
作者: PaulDing    時間: 2018-8-29 22:01

回復  PaulDing

只是一個變數值=0.3,數字越大,分配的越不平均

以平均值當中值,在乘以一個比例系 ...
n7822123 發表於 2018-8-29 00:13


n大 , 我太佩服您了 , 連這一點都有想到 , 感激非常. (讚讚讚讚讚讚讚)
作者: PaulDing    時間: 2018-8-30 20:52

回復  PaulDing

只是一個變數值=0.3,數字越大,分配的越不平均

以平均值當中值,在乘以一個比例系 ...
n7822123 發表於 2018-8-29 00:13


n大 , 不好意思再請教一下 , 若是要讓百分比也進行隨機分配的話我該調整哪個地方呢?
作者: n7822123    時間: 2018-8-31 03:00

本帖最後由 n7822123 於 2018-8-31 03:02 編輯

回復 12# PaulDing

把第一行改為:亂數比例範圍 = rnd

解釋:rnd=0~1
作者: PaulDing    時間: 2018-8-31 10:43

回復  PaulDing

把第一行改為:亂數比例範圍 = rnd

解釋:rnd=0~1
n7822123 發表於 2018-8-31 03:00


n大 , 我修改了後分配都到SKU10去了 , 是否我還有哪裡沒有修改好呢? 感恩.

[attach]29308[/attach]

Sub Project1SFSKU1toSKU10_Click()
亂數比例範圍 = Rnd
RN = Sheets(14).UsedRange.Rows.Count
ReDim Sum(RN - 1)
For r = 1 To RN - 1
  Sum(r) = Cells(r + 2, 2)
  ave = Sum(r) / 10
  For C = 1 To 9
    Cells(r + 2, C + 2) = Fix(((Rnd * 2) - 1) * (ave * 亂數比例範圍) + ave)
  Next C
  Cells(r + 2, 12) = "=sum(RC[-9]:RC[-1])"
  Cells(r + 2, 12) = Sum(r) - Cells(r + 2, 12)
Next r
End Sub
作者: n7822123    時間: 2018-9-1 00:32

本帖最後由 n7822123 於 2018-9-1 00:34 編輯

回復 14# PaulDing

因為被取整數了...............

我沒想到你的分配值還會有小於1的時候.........

把以下紅色字的部分刪除即可(Fix 會無條件捨去小數點,ex:Fix(0.53)=0)

Cells(R + 1, C + 3) = Fix(((Rnd * 2) - 1) * (ave * 亂數比例範圍) + ave)
作者: PaulDing    時間: 2018-9-1 16:22

回復  PaulDing

因為被取整數了...............

我沒想到你的分配值還會有小於1的時候.........

...
n7822123 發表於 2018-9-1 00:32


n大 , 感恩. 請教一下因我run了365 days發現SKU1~SKU9很平均(SKU10較大) , 要怎麼樣調整才能夠不平均呢?感恩.
作者: n7822123    時間: 2018-9-2 01:09

回復 16# PaulDing


亂數比例範圍 = 1

這樣應該就很不平均了!

如果你允許出現負值,大於1也是可以的
作者: PaulDing    時間: 2018-9-2 22:04

回復  PaulDing


亂數比例範圍 = 1

這樣應該就很不平均了!

如果你允許出現負值,大於1也是可以的 ...
n7822123 發表於 2018-9-2 01:09


感謝n大 , 調整試跑後可能真的要調整大於一方能夠較為顯著的差異 , 是否有方式可以將負值再隨機從中分配扣除呢? 此應該會要再多跑一圈對吧?
作者: n7822123    時間: 2018-9-3 00:46

本帖最後由 n7822123 於 2018-9-3 00:51 編輯

回復 18# PaulDing


你可能要思考一下你的條件合不合邏輯,

10個亂數的合要是一個定值,你要亂數範圍大於1,又不想要負值,這本身邏輯就很不合理了!

舉例來說,10個亂數和被限制和為200 ,平均一個亂數值=20

如果你把亂數比例範圍設定=2 ,表示亂數可能 20+/-40=-20~60

而其中-20~0的部分你又要重跑,要求最後跑出來一定要正值,或者等於0

假設你前5筆跑出來等於 40,55,30,28,38 光這些加起來就191,也就是說後面5筆可能加起來只能等於9

如果第6個跑出來超過9,後面4個一定會有負值,

所以第6個只能是9以下,而後面4個可能都是0

如果你知道我再說什麼,就知道這樣非常不合理!!

如果你亂數比例範圍設更大=5 ,可能後面8個數字都是0,因為要滿足你和=200 又不能負值的條件!

越多數字是0對你來說是越不平均嗎?

如果是如此,那第一個數字=和,後面九個數字都等於0 即可,不需要跑亂數。
作者: PaulDing    時間: 2018-9-5 15:04

回復  PaulDing


你可能要思考一下你的條件合不合邏輯,

10個亂數的合要是一個定值,你要亂數範圍大 ...
n7822123 發表於 2018-9-3 00:46


感謝龍大 , 想了一下確實如你所說 , 我想若要讓其再更不平均應該要手調一下 , 另外再請教一下龍大下面這段式子要計算的是? 感恩.

   ((Rnd * 2) - 1) * (ave * 亂數比例範圍) + ave)
作者: n7822123    時間: 2018-9-7 11:45

本帖最後由 n7822123 於 2018-9-7 11:51 編輯

回復 20# PaulDing

因為你有對10個數字的和設條件,假設和=200

那平均每個亂數的平均值ave必定要等於200/10=20

如果平均值超過20,加起來的和就超過200,反之亦同

Rnd:系統給的亂數值,範圍從0~1隨機抽取一個數值

Rnd*2:範圍從0~2隨機抽取一個數值

Rnd*2-1:範圍從-1~+1隨機抽取一個數值

把上述的值乘以任意數值就可以當成公差

若乘以30:(Rnd*2-1)*30=-30~+30

這裡我把"ave * 亂數比例範圍"  當做公差範圍,

如果ave=20,亂數比例範圍=1 那麼公差就是 -20~20(這就是為什麼  亂數比例範圍>1 有可能會有負數產生)

但是算出來的中值=0,這樣加總起來的平均值會等於0,不可能會等於你要的平均值

所以最後還要加上平均值ave,就得到最後式子

(Rnd * 2) - 1) * (ave * 亂數比例範圍) + ave
作者: PaulDing    時間: 2018-9-7 13:01

回復  PaulDing

因為你有對10個數字的和設條件,假設和=200

那平均每個亂數的平均值ave必定要等於20 ...
n7822123 發表於 2018-9-7 11:45


瞭解了. 感謝龍大的幫忙~~:handshake




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