Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.07.2014, 17:43   #1
Pamparam
Форумчанин
 
Регистрация: 08.11.2009
Сообщений: 225
По умолчанию Выбрать победителя по шансу

Напомните каким образом решить:
Нужно выбрать победителя из таблицы, где в поле написан шанс каждого.
Насколько помню, нужно сложить все значения в сумму, выбрать рандом число и как-то остановиться на нем. Как остановиться?
Pamparam вне форума Ответить с цитированием
Старый 22.07.2014, 08:41   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Нужно выбрать того, у кого шанс максимален?
Или случайным образом?
А шанс в каком виде задан?

И ещё, рандом это не стандартная функция. У Вас какая СУБД?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.07.2014, 09:10   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

http://programmersforum.ru/showthrea...27#post1022727
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 22.07.2014, 13:29   #4
Pamparam
Форумчанин
 
Регистрация: 08.11.2009
Сообщений: 225
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Нужно выбрать того, у кого шанс максимален?
Или случайным образом?
А шанс в каком виде задан?

И ещё, рандом это не стандартная функция. У Вас какая СУБД?
специально писал коротко, но достаточно, как мне казалось, для старожилов форума.
Нужно выбрать победителя, основываясь на шансах каждого игрока, которые изображены в виде каких-то чисел, т.е. у одного 1, у другого - 5, т.е. второй имеет в 5 раз больше шансов, чем первый.
в таблице есть список игроков и их шанс на победу, в каком виде не важно (разумеется не в относительном к 100%, т.к. количество участников не известно до определения победителя), т.к. их нужно будет складывать и выбирать случайное число, чтобы потом следующим запросом складывать поле шанса до того, пока сумма не будет равна этому случайному числу из (sum(chance)). Я помню решение данной задачи именно так, но не помню функционал
Можно вытащить вручную все поля участников, посчитать на каком-то ЯП все, что я описал выше, но это нерационально, т.к. долго и должно решаться средствами sql
субд - phpmyadmin, сервер - mysql
Цитата:
Сообщение от evg_m
http://programmersforum.ru/showthrea...27#post1022727
я создал тему в разделе sql не просто так...

Последний раз редактировалось Pamparam; 22.07.2014 в 14:57.
Pamparam вне форума Ответить с цитированием
Старый 22.07.2014, 14:07   #5
Pamparam
Форумчанин
 
Регистрация: 08.11.2009
Сообщений: 225
По умолчанию

Пришлось самому порыскать в поисках, раз никто не может помочь...
Код:
SELECT s.summ,users.*,@n:=@n+chance as gg 
from users,
(SELECT @n := 0) r,
(SELECT rand()*sum(chance) as summ from users) s
  group by users.id having @n<(s.summ) order by id;
Банально складывается n, пока сумма складываемых шансов не будет равна rand()*общую сумму шансов
Код:
 
 echo "Победитель -".mysql_result($at, mysql_num_rows($at)-1, gg);
можно еще добавить order by rand(), чтобы еще больше разнообразить выборку

Последний раз редактировалось Pamparam; 22.07.2014 в 14:14.
Pamparam вне форума Ответить с цитированием
Старый 22.07.2014, 14:10   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
m[k]:= {r=1,2,3} =1 если 1<=r<4 то номер игрока =1
{r=4} =2
{r=5,6,7,8,9.10,11} =3
на основании шансов (chance) СТРОИМ непересекающиеся(!) интервалы (minchance, maxchance) и имеющие "заданные" размеры
Код:
select nn, minchance, minchance + chance as maxchance
from ( select nn, ( select sum(chance) from t where t.nn<r.nn ) as minchance
         from r order by nn )
nn победил если random(sum(chance) ) between minchance and maxchance
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 22.07.2014 в 14:16.
evg_m вне форума Ответить с цитированием
Старый 22.07.2014, 14:42   #7
Pamparam
Форумчанин
 
Регистрация: 08.11.2009
Сообщений: 225
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
на основании шансов (chance) СТРОИМ непересекающиеся(!) интервалы (minchance, maxchance) и имеющие "заданные" размеры
Код:
select nn, minchance, minchance + chance as maxchance
from ( select nn, ( select sum(chance) from t where t.nn<r.nn ) as minchance
         from r order by nn )
nn победил если random(sum(chance) ) between minchance and maxchance
можно и подобно этому сделать, но мой проще, т.к. нет нескольких подзапросов и расчета диапазонов, а только groupby с складываемой переменной и остановка на определенном моменте, т.е. отсутствие подсчета лишних диапазонов
Pamparam вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа для определения победителя в соревнованиях khoman Microsoft Office Excel 1 17.08.2012 13:02
Выбрать из базы. sergeyrulit SQL, базы данных 8 01.02.2011 14:11
выбрать наименьшее(с++) jambas92 Помощь студентам 3 17.11.2010 00:26
Выбрать ОС Интересующаяся26 Операционные системы общие вопросы 8 02.10.2009 17:46