返回列表 上一主題 發帖

[發問] 將一固定值隨機分配到指定欄位

[發問] 將一固定值隨機分配到指定欄位

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

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

小丁

回復  PaulDing

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

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


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

TOP

本帖最後由 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
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

回復  PaulDing


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

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


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

   ((Rnd * 2) - 1) * (ave * 亂數比例範圍) + ave)
小丁

TOP

本帖最後由 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 即可,不需要跑亂數。

TOP

回復  PaulDing


亂數比例範圍 = 1

這樣應該就很不平均了!

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


感謝n大 , 調整試跑後可能真的要調整大於一方能夠較為顯著的差異 , 是否有方式可以將負值再隨機從中分配扣除呢? 此應該會要再多跑一圈對吧?
小丁

TOP

回復 16# PaulDing


亂數比例範圍 = 1

這樣應該就很不平均了!

如果你允許出現負值,大於1也是可以的

TOP

回復  PaulDing

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

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

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


n大 , 感恩. 請教一下因我run了365 days發現SKU1~SKU9很平均(SKU10較大) , 要怎麼樣調整才能夠不平均呢?感恩.
小丁

TOP

本帖最後由 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)

TOP

回復  PaulDing

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

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


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



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
小丁

TOP

        靜思自在 : 靜坐常恩己過、閒談莫論人非。
返回列表 上一主題