Я понимаю, что это сложный и конкретный, но, поскольку я беден от вероятности, я думал, что попытаюсь помочь в этом.
То, что я, по сути, хочу сделать, это получить случайное число с взвешенными вероятностями, основанное на предыдущем выборе случайных чисел.
То, как я хотел бы это настроить, это. (Предположим, что первый выбор случайный и простите мой синтаксис).
$start = 3;
$next = /* function call to get random value */
По сути, я хочу, чтобы вероятность 3
была самой высокой, 4
была второй по величине 5
чтобы быть третьей самой высокой, обертывая (по модулю некоторое число), так что 2
имеет наименьшую вероятность.
Как я могу это сделать? Я не хочу, чтобы один и тот же номер повторялся, я просто хочу более высокую вероятность его выполнения (а также более высокую вероятность того, что он будет последовательно, а не). Дайте мне знать, если требуется уточнение, но по существу с начальным выбором 3
и модулем 6
, я бы хотел, чтобы вероятности следующего выбора были примерно такими:
P(3)=30%
P(4)=25%
P(5)=20%
P(0)=12.5%
P(1)=7.5%
P(2)=5%
Я не задаюсь этими конкретными вероятностями, просто их порядок - односторонняя форма кривой колокола будет приятной (особенно если встроенная функциональность ее поддерживает).
Здесь односторонняя гаузианская кривая колокола, рассчитанная по полярному методу Марсалья
<?php
function rand_polar_onesided($m = 0.0, $s = 1.0){
do {
do {
$x = (float)mt_rand()/(float)mt_getrandmax();
$y = (float)mt_rand()/(float)mt_getrandmax();
$q = pow((2 * $x - 1), 2) + pow((2 * $y - 1), 2);
}
while ($q > 1);
$p = sqrt((-2 * log($q))/$q);
$y = ((2 * $y - 1) * $p);
$x = ((2 * $x - 1) * $p);
$val = $y * $s + $m
}
while($val < $m) // reject if the calculated value is smaller than the input
return $val;
}
?>
Применение:
rand_polar_onesided(MEAN, STANDARD_VARIANCE);