У меня есть код, который инициализирует объект кости следующим кодом:
public function initializeDiceSides($totalSides, $fair, $maxProbability = 100) { $maxTemp = $maxProbability; $sides = array(); for ($side = 0; $side < $totalSides; $side++) { //if we want fair dice just generate same probabilities for each side if ($fair === true) { $probability = number_format($maxProbability/$totalSides, 5); } else { //set probability to random number between 1 and half of $maxTemp $probability = number_format(mt_rand(1, $maxTemp/2), 5); //subtract probability of current side from maxtemp $maxTemp= $maxTemp- $probability; $sides[$side] = $probability; } } echo $total . '<br />'; print_r($sides); }
над отпечатками кода:
89 Array ( [0] => 48.00000 [1] => 13.00000 [2] => 14.00000 [3] => 9.00000 [4] => 2.00000 [5] => 2.00000 )
Я хочу, чтобы иметь возможность генерировать числа с плавающей точкой вместо целых чисел, я хочу иметь что-то вроде
Array ( [0] => 48.051212 [1] => 13.661212 [2] => 14.00031 [3] => 9.156212 [4] => 2.061512 [5] => 2.00000 )
Простым подходом было бы использовать lcg_value
и умножить его на диапазон и добавить значение min
function random_float ($min,$max) { return ($min + lcg_value()*(abs($max - $min))); }
Я бы просто генерировал случайные числа от 0 до 999999, а затем разделил их на 100000
Вы можете умножить переменные, которые вы mt_random
в mt_random
, например, на 100000, а затем разделить вывод на тот же коэффициент, чтобы получить значение float.
function random_float($min = 0, $max = 1, $includeMax = false) { return $min + \mt_rand(0, (\mt_getrandmax() - ($includeMax ? 0 : 1))) / \mt_getrandmax() * ($max - $min); }
Убедитесь, что значение $ maxProbability и $ totalSides – это float.
Если они являются целыми числами, результат будет набираться как целое число.