Я не совсем точно отвечу на ваши вопросы, но дам вам альтернативный подход к решению проблемы. Давайте переформулируем шанс прежде всего как единое целое и переименуем его в тикет. Каждый билет имеет уникальный и равный шанс быть выбранным в каждом раунде.
Допустим, вы продали в общей сложности 100 билетов в лотерее X. Данная лотерея состоит из 5 раундов
$rounds = 1; // starting round
$maxRounds = 5;
$tickets = range( 1, 100 );
Если вам нужно сравнить шансы игрока, у которого есть несколько билетов, это другой набор данных, который вы должны получить из своей базы данных. Для этого потребуется дополнительная таблица, содержащая эти данные, но она не должна «готовить» шанс появления билета. Если вам нужна эта статистика, вот пример (в php)
// total of 100 players
$players = range( 1, 100 );
$players = array_flip( $players );
// assign a random number of purchases per player
for( $i = 1; $i <= 100; $players[$i] = mt_rand( 1, 20 ), ++$i );
В результате получается
.
$tickets = range( 1, array_sum( $players ) );
Вернуться к исходной проблеме. Теперь у вас есть всего продано tickets
, и каждая лотерея имеет 5 раундов. Таким образом,
$rounds = 1;
$maxRounds = 5;
while( $rounds <= $maxRounds )
{
$winners = array_rand( $tickets, 3 );
$tickets = array_diff( $tickets, $winners );
shuffle( $winners );
foreach( $winners as $pos => $winner )
{
++$pos;
echo "Loterry: {$rounds} - Price {$pos} - winner is {$winner}<br />";
}
++$rounds;
}
Время настроить эхо с помощью чего-то, что вы сможете сохранить в своей базе данных за один раз. Поэтому я напишу последнюю часть для ясности. ПРИМЕЧАНИЕ , поскольку это простой пример и данные, которыми вы управляете, вы можете добавить их в свою базу данных, не фильтруя ее.
$rounds = 1;
$maxRounds = 5;
$insert = [ ];
while( $rounds <= $maxRounds )
{
$winners = array_rand( $tickets, 3 );
$tickets = array_diff( $tickets, $winners );
shuffle( $winners );
$insert[$rounds][ ] = $rounds;
foreach( $winners as $winner )
{
$insert[$rounds][ ] = $winner;
}
$insert[$rounds] = '(' . implode( ',', $insert[$rounds] ) . ')';
++$rounds;
}
$sql = sprintf( "INSERT INTO `lotteries`( `round`, `first`, `second`, `third` ) VALUES %s;", implode( ', ', $insert ) );
С этого момента вы можете использовать это утверждение для вставки в вашу базу данных. Просто измените имя таблицы и поля на то, что у вас есть в вашей базе данных. Я надеюсь, что это помогло