2011-05-30 33 views
2

在「三個人」中均勻分配數字的最佳方式是什麼?比如讓我們說我有300個東西,每個人得到100個,但是如果我有2個東西,那麼前兩個人得到1個,而第三個人是不幸的。什麼是最快的方式來做到這一點?有時候這300個數字會高達2,000,000,我不確定for()循環是否是最好的解決方案?在彩票系統中均勻分發獎品

回答

3

如果您的獎金是由P不可分割的單位,你有W贏家,那麼每位獲獎者將獲得:

P/W 

單位。

你已經支付了這些,你將不得不離開

P % W 

單位。如果這是零,你就完成了。如果這是P這意味着你有更多的獲勝者比你有獎品。你必須決定採取有自己的過程......最簡單的解決辦法是從存儲這樣的場合有些行賄基金借鑑

P - W 

如果餘數爲0或P其他的東西,那麼你必須自己決定什麼是最公平的事情做的是...也許開始一個賄賂基金....

編輯

發表意見之後,這樣你可以避免行賄基金:

my @winners = get_list_of_winners(); # Sorted randomly or in some 'fair' order 
my $base_prize = P/W;    # P and W defined as above 
my $leftovers = P % W; 
for my $i (0 .. $#winners) { 
    $winners[$i] = $base_prizel + (($i < $leftovers)?1:0); 
} 
+0

正確的我試圖避免融資基金類型的系統。只需按照第一個彩票贏家獲得額外彩票中的第一張彩票的方式進行分配。 – user766987 2011-05-30 16:28:48

+0

從他的問題來看,這聽起來好像他只是隨機分配剩下的人。有些人會得到(P/W)+ 1,有些人只會得到(P/W)。 – Jonah 2011-05-30 16:29:04

+2

確保['floor()'](http://php.net/floor)是'P/W'的值。有些語言不會計算整數值的小數位(比如Ruby),但是PHP可以。 – Jonah 2011-05-30 16:29:54

0

只要使用基於整數的數學。如果你只有兩個獎項可以放棄,三個人可以取勝,沒有人會贏得任何獎品。如果你有什麼遺漏,使得你的獎品數量不能被贏家數量整除,那麼你只剩下剩下的東西。沒有公平的做法,這是基本的數學。

2

我假設你的意思是你想在三個人中均勻分配剩餘的部分。

首先我會將2,000,000除以3並舍入。 (我們稱之爲x)
然後會花費2,000,000%(mod)3並找到結果。 (我們稱之爲y)

然後我會創建一個數組大小的人數你有。
設置每個元素X然後生成y和0之間隨機數X-1,並添加一個到每個指標的

像這樣:

<?php 
$items = 2000000; 
$winners = 3; 
$x = floor($items/$winners); 
$y = $item % $winners; 
$distribution = $array(); 
$distribution = array_fill(0, $winners, $x); 
for($i = 0; $i < $y; $i++) 
{ 
$distribution[rand(0, $winners - 1)]++; 
} 
?> 

現在你有一個元素數量與人數相同的數組,每個數組都填充了一些收到的項目。它可能不是平均的,但它是公平的和隨機的。