<?php namespace App\Library; class RouletteWheel { /** * Pick a random element from an array based on its probability. * * @param $a * * @return int|string */ public static function generate($a) { $sum = 0.0; $total = array_sum(array_values($a)); $r = self::frandom(); // just in case if ($r == $sum) { // in other words, r == 0 return array_keys($a)[0]; } foreach ($a as $key => $percentage) { $newsum = $sum + (float) $percentage / (float) $total; if ($r > $sum && $r <= $newsum) { return $key; } $sum = $newsum; } // just in case return array_keys($a)[sizeof($a) - 1]; } /** * Generate a random float. * * @return float random */ public static function frandom() { return (float) rand() / (float) getrandmax(); } }