2014-09-25 46 views
1
rand(1,5) 

..生成隨機數例如:4 3 2 3 2(總和等於14)。隨機,但不應超過總數

我想總不超過x(這是說5),所以在這種情況下,它可能是:

1 + 2 + 2 = 5 
2 + 3 = 5 

...等可變長度只要sum < x

我應該生成一個隨機的,檢查x,生成另一個,再次檢查或有另一種方式嗎?

+1

你想生成一組固定長度的或希望的一組變長的,只要它的'總和 kero 2014-09-25 13:01:32

+0

可變長度,只要'sum 3zzy 2014-09-25 13:06:22

回答

4

最明顯的方法就是保持循環,併產生一個越來越小的隨機數,直到你被封鎖。

$min = 2; 
$max = 5; 
$randoms = []; 
while ($max > $min) { 
    $max -= ($rand = rand($min, $max)); 
    $randoms[] = $rand; 
} 

更新的實際使用情況(見註釋):

function generateRandomSpend($balance, $maximum = 5, $minimum = 2) { 
    $amounts = array(); 

    while ($balance) { 
     // If we can't add any more minimum-spends, stop 
     if ($balance - $minimum < 0) { 
      break; 
     } else { 
      // Don't generate pointlessly-high values 
      $maximum = min($balance, $maximum); 
      $balance -= $amounts[] = rand($minimum, $maximum); 
     } 
    } 

    return $amounts; 
} 

print_r($s = generateRandomSpend(10)); 

你也可以做

echo array_sum(generateRandomSpend(10)); 

得到他們總支出的數值。

3

這也是工作,並給結果要

<?php 
    $fixed = 5; 
    $random = array(); 
    $no = 0; 
    while(1) { 
     $number = rand(1,5); 
     $no +=$number; 
     if($no > $fixed) { 
      break; 
     } 
     $random[]= $number; 
    } 
    ?> 
+0

@joe問題是指定sum <5不是eqauls爲5,所以它可以。首先不給3,它會單獨3 – 2014-09-25 13:42:52

+0

'而(1)',經典。 – 2014-09-25 13:47:36