@Dokma

Как понизить шанс выпадения числа?

Например у нас есть числа от 0 до 15. Я делаю getrandomint(0,15) и получаю рандомное число из этой выборки. Но тут при определенных условиях мне нужно понизить шанс выпадени цифер от 1 до 7. Т.е мне так же нужно рандомное число от 0 до 15, но что бы шанс выпадения чисел от 1 до 7 был меньше. Первое что пришло в голову это заполнять массив этими числами и делать рандомную выбору уже оттуда, но эта идея не очень хорошо работала. Может предложите свой алгоритм реализации? Можно и с массивом, но что бы работало)
  • Вопрос задан
  • 399 просмотров
Решения вопроса 1
Arekus
@Arekus
// задаем вероятности выпадания числа в каждом промежутке. Суммарный prob должен быть равен 100
$data = [
	[
		'start' => 0,	// начало промежутка
		'end' => 7,		// окончание промежутка
		'prob' => 20, 	// вероятность попадания, %
	],
	[
		'start' => 8,	// начало промежутка
		'end' => 15,	// окончание промежутка
		'prob' => 80, 	// понижающий коээффициент на вероятность, %
	]
];


// вызываем функцию для получения произвольного числа с учетом вероятности попадания в промежуток
function calcRand($data) {
	$prob = rand(0, 100);
	$pr = 0;
	$out = 0;
	foreach ($data as $info) {
		if ($prob >= $pr && $prob < $pr + $info['prob']) {
			$out = rand($info['start'], $info['end']);
			break;
		}
		$pr += $info['prob'];
	}
	return $out;
}


// проверочный код для демонстрации распределения
$numbers = [];
for ($i = 0; $i < 10000; $i++) {
	$number = calcRand($data);

	$numbers[$number] = (isset($numbers[$number]) ? $numbers[$number] + 1 : 1);
}
ksort($numbers);

echo '<pre>';
var_export($numbers);
var_export(array_map(function($a) { return round($a / 100); }, $numbers));
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы