У меня есть php-файл, в котором я хочу получить случайное число, но я хочу, чтобы с вероятностью 80% оно равнялось 1. А затем с 20% — 2, 3 или 4. Обычно вы можете сделать что-то вроде этого:
rand(1, 4)
Но я хочу иметь больше шансов получить 1
как я объяснил.
Вы можете использовать другой ранд:
$rand = rand(1, 10);
if ($rand <= 8)
$value = 1;
else
$value = rand(2,4);
Сгенерируйте число в [-10, 4] и преобразуйте:
$value = max(1, rand(-10, 4))
Это будет иметь правильное распределение и должно хорошо работать. Это не так легко, как решение с двумя розыгрышами, но будет быстрее.
Хотя ответы @Bathsheba и @djidi являются лучшими. Здесь другой подход.
Так как 1
часть должна 80% и 2,3,4
должно быть 20%, мы умножаем количество сгенерированных случайных чисел таким образом, чтобы 3 числа равнялись 20% (в этом случае получим 15):
<?php
$random = rand(1,15);
$result = 0;
switch($random) {
case 2:
case 3:
case 4:
$result = $random;
break;
default:
$result = 1;
}
echo $result;
Шанс получить 1 = 12/15 = 0,8
Шанс получить либо 2, 3, либо 4 = 1/15 = 0,066666666667
В ответ Вирсавии:
Шанс получить 1 = 12 * 1/15 = 12/15 = 0,8 (поскольку между -10 и 4 существует 15 чисел)
Шанс получить либо 2, 3, либо 4 = 1/15 = 0,066666666667 (так как только 3 числа выживают max()
неизмененный)
В ответе Джиди:
Шанс получить 1 = 8/10 = 0,8
Шанс получить 2, 3 или 4 = 2/10 * 1/3 = 2/30 = 1/15 = 0,066666666667
Математика остается прежней =)