eozzy
eozzy

Reputation: 68720

Random, but should not exceed total

rand(1,5)

.. generates random numbers for example: 4 3 2 3 2 (sum is equal 14).

I want the total to NOT exceed x (which is say 5), so in this case, it could be:

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

and so on ... variable length as long as sum < x

Should I generate a random, check against x, generate another, check again or is there another way?

Upvotes: 1

Views: 118

Answers (2)

Joe
Joe

Reputation: 15812

The most obvious way is just to keep looping and generating a smaller and smaller random number until you're capped out.

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

Updated for the actual use-case (see comments):

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) );

You can also do

echo array_sum( generateRandomSpend(10) );

to get a numeric value of their total spend.

Upvotes: 4

Pk boss
Pk boss

Reputation: 264

This is also working and give result which you want

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

Upvotes: 3

Related Questions