1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/gadflybsd-Lottery

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

#Лотерея для 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 )

Вы можете оставить комментарий после Вход в систему

Введение

Реализация механизма случайного розыгрыша призов на PHP с ограничением общего количества призов и автоматическим снижением вероятности выигрыша после выдачи приза при использовании базы данных. Развернуть Свернуть
LGPL-3.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/gadflybsd-Lottery.git
git@api.gitlife.ru:oschina-mirror/gadflybsd-Lottery.git
oschina-mirror
gadflybsd-Lottery
gadflybsd-Lottery
master