Неравномерное распределение

Xupypr

Новичок
День добрый.

Тут возник вопрос к изящности алгоритма распределения.

Задача такая. Есть несколько игровых миров, ну пусть будет 4 для начала. Заходит новый игрок, надо его зарегистрировать в определенном игровом мире по следующему правилу:

в первый мир попадает 1 игрок, во 2 два, в третий 5, в четвертый 10.
Это распределение задается в конфиге, количество игровых миров конечно и также задается в админке. Количество распределяемых также известно (в частности 18).

сейчас тупо считается до 18 + условия, если 1, то в 1, 2 и 3 во 2 и т.д.. затем сбрасывается счетчик.

вся сложность в том, что при изменении распределения, надо менять и цифры в условиях.

Под конец недели что-то совсем не соображу. Есть идея просто запоминать сколько народу заходит, делить на количество распределяемого народа (18) и остаток от деления использовать, тогда счетчик не надо обновлять постоянно. А вот как сделать так что забил 1-2-5-10 в переменной (видимо в массиве) и 1 условие, чтоб понять куда его регать.
 

Xupypr

Новичок
воспаленый разум родил такое решение

PHP:
	$gamers_raspred[1] = 1;
	$gamers_raspred[2] = 2;
	$gamers_raspred[3] = 5;
	$gamers_raspred[4] = 10;

	$gamers_max=0;
	foreach ($gamers_raspred as $key=>$value)
		$gamers_max+=$value;

	$gcw_k = $gamers_count%($gamers_max);
	
	$world_id = 1;
	foreach ($gamers_raspred as $key=>$value)
		if ($gcw_k>=$value) 
				{
					$world_id=$key;
				} else break;
например $gamers_count=3...
3 больше-равно 1 - да, пишем 1 мир
3 больше-равно 2 - да, пишем 2 мир
3 больше-равно 5 - нет, оставляем 2 мир и вываливаемся из цикла

в итоге 3 чел во 2й мир
 

Sender

Новичок
я бы на вашем месте в понедельник не употреблял вещества перед работой :)
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
если задача только в распределении нагрузки, и привязки user_id к серверу нет, я бы cделал случайно-взвешенное распределение
PHP:
$gamers_raspred[1] = 1;
$gamers_raspred[2] = 2;
$gamers_raspred[3] = 5;
$gamers_raspred[4] = 10;
asort($gamers_raspred,SORT_NUMERIC );
$x = mt_rand (1, array_sum($gamers_raspred) ); 
foreach ($gamers_raspred as $key => $y){
 $x -= $y;
 if ($x<=0){
   break;
 }
}
echo $key;
 

Xupypr

Новичок
о! случайно-взвешенное распределение... Отлично. Чутка переделал, чтоб всеж не случайное было, а так то что надо.

я бы на вашем месте в понедельник не употреблял вещества перед работой
это даа.. )) писал в пятницу вечером, а там прет без всякого компота )))
 
Сверху