Skip to content

Instantly share code, notes, and snippets.

@irazasyed
Created January 8, 2016 09:21
Show Gist options
  • Star 26 You must be signed in to star a gist
  • Fork 8 You must be signed in to fork a gist
  • Save irazasyed/f41f8688a2b3b8f7b6df to your computer and use it in GitHub Desktop.
Save irazasyed/f41f8688a2b3b8f7b6df to your computer and use it in GitHub Desktop.
PHP: Utility function for getting random values with weighting.
<?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
Copy link

ombou commented Apr 30, 2021

the array values have to be in asc order

@KarelWintersky
Copy link

@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