Let's say I have something like this: $colors=array("red", "blue"); And I want to randomly echo one of the things in the array. But let's say I want it to be more likely for it to be red than blue. I guess I could put red into the array twice, but is there a quicker way? I'm very, very lazy.
__________________
If you're reading this, it may already be too late!
The only easy way, without actually writing out the probability equations using PHP code, is to create an array with the correct number of entries with the "weight" you want -
PHP Code:
$colors=array("red", "blue"); // gives one out of two chance for red
$colors=array("red", "red", "blue"); // gives two out of three chance for red
$colors=array("red", "red", "red", "blue"); // gives three out of four chance for red
You could shorten the data structure to a color/weight pair, but you would need to add code to produce the expanded array with all the entries. To get a computer to randomly pick from the weighted possibilities, you need a "pool" of the available choices to pick from.
You can use the shuffle(...) or array_rand(...) function instead of a random number to actually generate a random entry.
__________________
If you are learning PHP, developing PHP code, or debugging PHP code, do yourself a favor and check your web server log for errors and/or turn on full PHP error reporting in php.ini or in a .htaccess file to get PHP to help you.
Try it and see if it produces the array you expect. That's where writting, testing, and debugging code gets fun, getting code to do what you want.
__________________
If you are learning PHP, developing PHP code, or debugging PHP code, do yourself a favor and check your web server log for errors and/or turn on full PHP error reporting in php.ini or in a .htaccess file to get PHP to help you.
Just another method you can use if it suits you... it simulates an array with duplicates determining priority instead of actually making one, but I don't know whether it's faster or not.
PHP Code:
function array_weighted_rand($ary)
{
# Pick a random index as if the array was arranged so that it actually
# had more entries of the values with higher probabilities
# eg. for values = [ red, blue, green]
# and probabilities = [ 2, 1, 3]
# assume something like:
# 0 => red
# 1 => red
# 2 => blue
# 3 => green
# 4 => green
# 5 => green
$prob_idx = mt_rand(0, array_sum(array_values($ary)) - 1);
# Find where the selected index maps to the real indices by calculating
# a running sum on the probabilities and returning whenever the index
# is exceeded.
$running_sum = 0;
foreach ($ary as $value=>$prob)
{
$running_sum += $prob;
if ($running_sum > $prob_idx)
return $value;
}
}