Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Помогите решить проблему с выдачей данных

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Опрос
опроса нет
Для голосования и просмотра результатов опроса войдите или зарегистрируйтесь

> Без описания
lastdays
Отправлено: 24 Марта, 2013 - 01:17:21
Post Id



Частый гость


Покинул форум
Сообщений всего: 221
Дата рег-ции: Март 2013  


Помог: 7 раз(а)




Здравствуйте , помогите пожалуйста решить проблему.

Код:
PHP:
скопировать код в буфер обмена
  1.  
  2. ## Случайное число
  3. $rand = mt_rand(0,4);
  4. echo "Могло выпасть: ".$rand." шт. подарков <br>";
  5. if ($rand > 0) {
  6. $prizes = mysql_query("SELECT `id`,`group`,`chance` FROM `prizes` WHERE `group`=1 ORDER BY RAND() LIMIT ".$rand." ");
  7. while($p = mysql_fetch_array($prizes)){
  8. ## Шанс удачи
  9. $r = mt_rand(1,1000)/10;
  10. ## Если шанс подарка больше чем нам выпало ( значит повезло)
  11. if ($p["chance"]>$r) {
  12. $items = array($p["id"]);
  13. $itemKey = array_rand($items);
  14. $item = $items[$itemKey];
  15. unset($items[$itemKey]);
  16. echo "Выпал подарок: <b><font color=red>".$item."</font></b> Мой шанс: ".$r.", Шанс что упадет подарок ".$p["chance"]." <br> ";
  17. }else{
  18. echo "<b>Неудачно</b><br>";
  19. }
  20. $rand--;
  21. } // while
  22. } // rand
  23.  



Что выходит.
Сначало выбирает случайное число от 0 до 4.
Если больше чем 0, считываем с таблицы prizes случайное кол-во подарков, в зависимости что нам выпало.
Прекрасно выбирает рандомные подарки и только после, с учетом их % выпадения выдает человеку.

Так вот, у каждого подарка есть свой % шанса, что он выпадет.

Не выходит сделать следующее:

Необходимо чтоб подарки могли выдаватся с учетом их шанса.


К примеру:
id=1; group = 1; chance = 100
id=2; group = 1; chance = 26.6
id=3; group = 1; chance = 24.2
id=4; group = 1; chance = 100
id=5; group = 1; chance = 13.3
id=6; group = 1; chance = 11


проблема: Чтоб подарки с наибольшем значением chance падали чаще.
У меня же сейчас выбирает абсолютно рандомные подарки и выдает.

Помогите пожалуйста решить проблему.

п.с. Если что-то непонятно, напишите - попробую переформулировать.

(Отредактировано автором: 24 Марта, 2013 - 01:19:41)

 
 Top
DelphinPRO
Отправлено: 24 Марта, 2013 - 01:45:54
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




я так думаю, нужно знать общее количество выпавших подарков (ALL), количество выпадений каждого подарка (PRIZE) и шанс в процентах для каждого подарка (CHANCE).

тогда сможем определить процент выпадения подарка (PRIZE/ALL)*100
и если он больше допустимого - отдаем пользаку

PHP:
скопировать код в буфер обмена
  1. if (($PRIZE/$ALL)*100 > $CHANCE) {
  2.   $PRIZE++;
  3.   $ALL++;
  4.   // Bingo!
  5. }


Значение ALL инкрементируем при выпадении любого подарка, а PRIZE при выпадении конкретного подарка.

Как-то так, наверное.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
lastdays
Отправлено: 24 Марта, 2013 - 02:26:21
Post Id



Частый гость


Покинул форум
Сообщений всего: 221
Дата рег-ции: Март 2013  


Помог: 7 раз(а)




DelphinPRO пишет:
я так думаю, нужно знать общее количество выпавших подарков

$rand = mt_rand(0,4);

DelphinPRO пишет:

количество выпадений каждого подарка (PRIZE) и шанс в процентах для каждого подарка (CHANCE).

Так то в этом и проблема, сначало получаем кол-во возможно выпавших подарков, а только после считываем это кол-во с базы, но надо ещё так же и просчитать теорию вероятности сразу или после.. я это и не могу выполнить правильно.


DelphinPRO пишет:

тогда сможем определить процент выпадения подарка (PRIZE/ALL)*100
и если он больше допустимого - отдаем пользаку

Так я и определяю:
if ($p["chance"]>$r)

Если подарок с шансом *** больше чем выпало цифр нам, то держи.

DelphinPRO пишет:

Значение ALL инкрементируем при выпадении любого подарка, а PRIZE при выпадении конкретного подарка.

Как-то так, наверное.


А не могли бы показать с уже моим примером что Вы имели ввиду?






Сформулирую иначе:

Всего 10 подарков.
Упасть могут 0 - 4

Предположим, выпало число 2.
Значит считать с таблицы нужно 2 подарка и сразу учесть наш шанс и шанс выпада самого подарка.
Если нам повезло дважды, соотвественно - добавляем человеку 2 подарка.

Вот в этом и проблема.

(Отредактировано автором: 24 Марта, 2013 - 02:30:43)

 
 Top
lastdays
Отправлено: 25 Марта, 2013 - 10:24:41
Post Id



Частый гость


Покинул форум
Сообщений всего: 221
Дата рег-ции: Март 2013  


Помог: 7 раз(а)




Проблему решил:

если повезло, посчитал сколько подарков выпало удачно.

остановил цикл на нужном мне кол-ве.

а тут в базу добавилось не больше - нужного.

(Отредактировано автором: 25 Марта, 2013 - 10:25:00)

 
 Top
DelphinPRO
Отправлено: 25 Марта, 2013 - 13:47:16
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




lastdays пишет:
я так думаю, нужно знать общее количество выпавших подарков
$rand = mt_rand(0,4);
тут я имел ввиду общее количество всех выданных подарков


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
lastdays
Отправлено: 26 Марта, 2013 - 02:56:14
Post Id



Частый гость


Покинул форум
Сообщений всего: 221
Дата рег-ции: Март 2013  


Помог: 7 раз(а)




Я понял, я же вывожу все подарки циклом
Предположим их 5
Каждый подарок в цикле расчитывается на удачу.

1) Повезло
2) Повезло
3) Повезло
4) Не повезло
5) Повезло

И считаю я только те, что выпали.

Если кол-во выпавших достигнет максимального лимита, просто отрезаем последующие.


И даст пользователю только первые 4 подарка.
А сам список в цикле выводится рандомно.





А с вашей идеей как работать?

PHP:
скопировать код в буфер обмена
  1.  
  2. if (($PRIZE/$ALL)*100 > $CHANCE) {
  3.   $PRIZE++;
  4.   $ALL++;
  5.   // Bingo!
  6.  
  7. }


ведь $PRIZE и есть кол-во подарков

получается, (5/5)*100 > шанс каждого подарка? непонятно.. по этому я и просил показать в примере.

(Отредактировано автором: 26 Марта, 2013 - 02:56:47)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB