Created
January 8, 2016 09:21
-
-
Save irazasyed/f41f8688a2b3b8f7b6df to your computer and use it in GitHub Desktop.
PHP: Utility function for getting random values with weighting.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* getRandomWeightedElement() | |
* Utility function for getting random values with weighting. | |
* Pass in an associative array, such as array('A'=>5, 'B'=>45, 'C'=>50) | |
* An array like this means that "A" has a 5% chance of being selected, "B" 45%, and "C" 50%. | |
* The return value is the array key, A, B, or C in this case. Note that the values assigned | |
* do not have to be percentages. The values are simply relative to each other. If one value | |
* weight was 2, and the other weight of 1, the value with the weight of 2 has about a 66% | |
* chance of being selected. Also note that weights should be integers. | |
* | |
* @param array $weightedValues | |
*/ | |
function getRandomWeightedElement(array $weightedValues) { | |
$rand = mt_rand(1, (int) array_sum($weightedValues)); | |
foreach ($weightedValues as $key => $value) { | |
$rand -= $value; | |
if ($rand <= 0) { | |
return $key; | |
} | |
} | |
} |
@ombou , no, not required. I tested the operation of this function - regardless of the order of the weights in the array, the results are similar to the truth.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
the array values have to be in asc order