2011-11-15 46 views
3

是否有一個很好的算法將隨機生成的數字拆分爲三個桶,每個桶都有可能包含的總數的限制。將數字拆分爲三個帶有限制的桶

例如,說我的隨機生成的數字是1,000,我需要將它分成桶a,b和c。

These ranges are only an example. See my edit for possible ranges. 
Bucket a may only be between 10% - 70% of the number (100 - 700) 
Bucket b may only be between 10% - 50% of the number (100 - 500) 
Bucket c may only be between 5% - 25% of the number (50 - 250) 
a + b + c must equal the randomly generated number 

你想分配是完全隨機的金額所以只是作爲平等斗的機會一擊中其最大的除了所有三個桶被周圍的百分比平均值作爲平等的機會C桶。

編輯:以下將很可能總是如此:a + b + c的低端100%,a + b + c的高端> 100%。這些百分比僅表示a,b和c的可接受值。在a爲10%而b和c爲最大(分別爲50%和25%)的情況下,這些數字將不得不重新分配,因爲總數不等於100%。這是我試圖避免找到一種方法來分配這些數字的確切情況。

我想找到一種方法來在一個範圍內隨機選擇這些數字。

+1

如果我們選擇第一桶的10%,那麼最大數量,我們可以得到的是(10%+ 50%+ 25%)* X = 85的初始數量的%。所以a + b + c不能成立。 – pnezis

+0

對不起,這個不清楚。我已更新該帖子。 – Aaron

回答

0

更新:是的,你是對的,結果是不均勻分佈的。假設你的百分比值是自然數(如果這個假設是錯誤的,你不需要進一步閱讀:)在這種情況下,我沒有解決方案)。

讓我們定義一個事件e作爲3個值(每個桶的百分比)的元組:E =(P 一個,對 b,對Ç)。接下來,創建所有可能的事件e n。你在這裏是一個由不連續事件數組成的元組空間。所有可能的事件都應該有相同的可能性發生。

假設我們有函數f(n)=> e n。然後,我們所要做的就是取一個隨機數n並一次返回e n。現在

,問題依舊創建這樣一個功能f :)

在僞代碼(僅僅是一個例子)一個非常緩慢的方法:

function f(n) { 
    int c = 0 
    for i in [10..70] { 
     for j in [10..50] { 
      for k in [5..25] { 
       if(i + j + k == 100) { 
        if(n == c) { 
         return (i, j, k) // found event! 
        } else { 
         c = c + 1 
        } 
       } 
      } 
     } 
    } 
} 

你必須知道什麼是單通道解決方案,但問題只會被移走。函數f非常慢。但是你可以做得更好:如果你正確地設置了範圍並計算偏移量而不是迭代你的範圍,我認爲你可以更快地計算一切。

這足夠清楚了嗎?


首先,您可能需要調整您的範圍。 10%桶a是不可能的,因爲你不能得到條件a+b+c = number舉行。

關於您的問題:(1)爲您的範圍內的存儲桶a挑選一個隨機數,然後(2)以最小和最大百分比(您只應縮小範圍)更新存儲區b的範圍。然後(3)爲桶b挑選一個隨機數。最後c應該計算出你的條件成立(4)。

例子:

n = 1000 
(1) a = 40% 
(2) range b [35,50], because 40+35+25 = 100% 
(3) b = 45% 
(4) c = 100-40-45 = 15% 

或者:

n = 1000 
(1) a = 70% 
(2) range b [10,25], because 70+25+5 = 100% 
(3) b = 20% 
(4) c = 100-70-20 = 10% 

這是檢查所有事件是否是均勻分佈的。如果應該是一個問題你可能想隨機化範圍更新在步驟2

+0

我已更新問題以解決10%的可能性和問題。 – Aaron

+0

@Aaron:更新了我的答案,對你更有用嗎? – duedl0r

2

的問題等同於N維對象選擇隨機點(在您的示例,N = 3),被定義的對象由公式(在你的例子):

0.1 <= x <= 0.7 
0.1 <= y <= 0.5 
0.05 <= z <= 0.25 
x + y + z = 1 (*) 

顯然,因爲最後一個方程(*)的座標之一是多餘的,即採摘值x和y的規定ž。

消除(*)和其它等式中的一個給我們留下了一個(N-1)維中,例如

0.1 <= x <= 0.7 
0.1 <= y <= 0.5 

在由不等式

0.05 <= (1 - x - y) <= 0.25 (**) 

,從(*)導出並用於Z的方程切割。這基本上是通過盒子的斜條紋。

爲了使結果是均勻的,我也只是反覆採樣(N-1)維框,接受所述第一採樣點即滿足(**)。單通解決方案可能最終會出現偏差分佈。

+0

這個問題是如果x和y都是0.1。這意味着z必須在0.8以外,超出其可接受範圍。 – Aaron

相關問題