#Лотерея для ThinkPHP: концепция вероятностного розыгрыша призов
Можно настроить ограничение общего количества призов и автоматическое снижение вероятности выигрыша после получения приза.
$prize = array(
'0' => array('id'=>1,'name'=>'Планшетный компьютер','probability'=>1),
'1' => array('id'=>2,'name'=>'Цифровая камера','probability'=>5),
'2' => array('id'=>3,'name'=>'Акустическая система','probability'=>10),
'3' => array('id'=>4,'name'=>'4G-накопитель','probability'=>12),
'4' => array('id'=>5,'name'=>'Монета номиналом 10Q','probability'=>22),
);
###Пример структуры базы данных Если количество отдельных призов превышает 1000, необходимо увеличить количество знаков после запятой в поле probability, например, до 9,5 при количестве 10 000. Также необходимо изменить значение 4 в триггере pre_lottery_before_upd_tr на 5.
DROP TABLE IF EXISTS `pre_lottery`;
CREATE TABLE `pre_lottery` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL COMMENT 'Название приза',
`description` TEXT DEFAULT NULL COMMENT 'Описание приза',
`imgpath` varchar(255) DEFAULT NULL COMMENT 'Путь к изображению приза',
`ticket` decimal(11,2) DEFAULT '0.00' COMMENT 'Стоимость приза',
`total` int(11) DEFAULT '0' COMMENT 'Общее количество отправленных призов',
`probability` decimal(8,4) DEFAULT '100.0000' COMMENT 'Вероятность получения приза',
`dateline` int(11) DEFAULT '0' COMMENT 'Дата создания приза',
`status` smallint(6) DEFAULT '0' COMMENT 'Статус приза, -1 --> удалено, 0 --> нормально',
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Список призов лотереи';
DROP TRIGGER IF EXISTS `pre_lottery_before_ins_tr`;
CREATE TRIGGER `pre_lottery_before_ins_tr` BEFORE INSERT ON `pre_lottery`
FOR EACH ROW
BEGIN
SET NEW.dateline = UNIX_TIMESTAMP(now());
END;
DROP TRIGGER IF EXISTS `pre_lottery_before_upd_tr`;
CREATE TRIGGER `pre_lottery_before_upd_tr` BEFORE UPDATE ON `pre_lottery`
FOR EACH ROW
BEGIN
IF(NEW.total < OLD.total) THEN
SET @pro = ROUND((OLD.total - NEW.total) / NEW.total, 4);
SET NEW.probability = NEW.probability - @pro;
ELSEIF(NEW.total > OLD.total) THEN
SET @pro = ROUND((NEW.total - OLD.total) / NEW.total, 4);
SET NEW.probability = NEW.probability + @pro;
ELSE
SET NEW.probability = OLD.probability;
END IF;
END;
###Способ использования массива
Vendor('Lottery');
$awards = array(
'0' => array('id'=>1,'name'=>'Планшетный компьютер','probability'=>1),
'1' => array('id'=>2,'name'=>'Цифровая камера','probability'=>5),
'2' => array('id'=>3,'name'=>'Акустическая система','probability'=>10),
'3' => array('id'=>4,'name'=>'4G-накопитель','probability'=>12),
'4' => array('id'=>5,'name'=>'Монета номиналом 10Q','probability'=>22),
);
$Lottery = new Lottery($awards);
dump($Lottery->roll()); // Стандартный алгоритм или использование классического алгоритма dump($Lottery->roll('rand'));
###Использование базы данных
Vendor('Lottery');
$Lottery = new Lottery('Lottery');
dump($Lottery->roll()); // Стандартный алгоритм или использование классического алгоритма dump($Lottery->roll('rand'));
###Возвращаемые данные после розыгрыша
array(5) {
["errcode"] => int(0)
["roll_key"] => int(3)
["msg"] => string(12) "Розыгрыш успешен"
["prize"] => array(4) { //Данные о выигранном призе этого розыгрыша
["id"] => int(4)
["name"] => string(8) "4G-накопитель"
["probability"] => int(12)
["key"] => string(3) "да"
}
["awards"] => array(5) { // Данные о невыигранных призах этого розыгрыша
[0] => array(4) {
["id"] => int(6)
["name"] => string(37) "Может быть, завтра вам повезёт!"
["key"] => string(2) "нет"
["probability"] => int(50)
}
[1] => array(4) {
["id"] => int(2)
["name"] => string(12) "Цифровая камера"
["probability"] => int(5)
["key"] => string(3) "да"
}
[2] => array(4) {
["id"] => int(3)
["name"] => string(12) "Акустическая система"
["probability"] => int(10)
["key"] => string(3) "да"
}
[3] => array(4) {
["id"] => int(1)
["name"] => string(12) "Планшетный компьютер"
["probability"] => int(1)
["key"] => string(3) "да"
}
[4] => array(4) {
["id"] => int(5)
["name"]=> string(6) "Монета номиналом 10Q"
["probability"]=> int(22)
["key"]=> string(3) "да"
}
}
}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )