標題:

Excel 問題

發問:

若果我想在Excel隨機抽 1 個數字 ( 係 1 至 50 之中抽 ) 。 但1-10抽中既機率係20%,11-30抽中既機率係55%,31-50抽中既機率係25%。 咁請問條式應該點寫 ???

aa.jpg

 

此文章來自奇摩知識+如有不便請留言告知

最佳解答:

以下的 macro, 1. 先抽出一個 1 - 100 的隨機數, 2. 然後將 1-20 的數 (即 20%) 壓縮為 1-10. 3. 將 21-75 的數 (即 55%) 壓縮為 11-30. 4. 將 76-100 的數 (即 25%) 壓縮為 31-50. 並重複200 次來測試是否真的在所要求的機率之內. 結果令人滿意. 真正要用時(即不是測試, 而只是 generate 一個隨機數), 只要將 for i = 1 to 200 的 200 改為 1 就可以了. Sub rand_gen() For i = 1 To 200 x = Rnd() * 100 + 1 If x = 21 And x = 76 Then z = x - 76 y = Int(z / 1.25) y = y + 31 GoTo res End If res: Cells(i, 1) = y Next i End Sub

其他解答:

由于用兩條公式, 如公式需下拉或右拉會相當麻煩及借用相當多輔助格, 效果並不理想。 故建議用 CHOOSE取代IF, 可以將兩條公式合併而不需要輔助格 任何一格輸入: =INT(CHOOSE(LOOKUP(RAND(),{0,0.2,0.55},{1,2,3}),RAND()*10+1,RAND()*20+11,RAND()*20+31)) 下拉, 右拉均可以 2009-06-22 00:23:19 補充: 樓上公式有錯, 更正為(0.55應為0.75): =INT(CHOOSE(LOOKUP(RAND(),{0,0.2,0.75},{1,2,3}),RAND()*10+1,RAND()*20+11,RAND()*20+31)) 2009-06-22 00:34:07 補充: vba代碼: Function irand() Application.Volatile x = Rnd() Select Case x Case Is > 0.75 irand = Int(Rnd() * 20 + 31) Case Is > 0.2 irand = Int(Rnd() * 20 + 11) Case Else irand = Int(Rnd() * 10 + 1) End Select End Function 任何一格 輸入 =irand() 可下拉, 右拉 2009-06-22 00:39:06 補充: 樓上代碼中加上 Application.Volatile, 即程式容許易變 按F9 或工作表有任何編輯, 所有數據都會自動更新, 效果與之前的公式辦法一樣。 如不加上Application.Volatile, 傳值便不會易變|||||由於抽中 1-50 的機會不一樣,我們需要兩條公式才能解決問題:(後面是詳解) (公式一) 在 A1 輸入以下公式 =(INT(RAND()*100)+1)/100 (公式二) 在 B1 輸入以下公式,得出答案 =IF(A1

arrow
arrow
    創作者介紹
    創作者 rll33xb99t 的頭像
    rll33xb99t

    rll33xb99t的部落格

    rll33xb99t 發表在 痞客邦 留言(0) 人氣()