Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Веб-программирование > PHP / MySQL

PHP / MySQL Создание динамических Веб-ресурсов

Ответ
 
Опции темы
Старый 18.06.2014, 14:48   #1
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Порядок выполнения в Update

Допустим есть такой запрос:

UPDATE table_name SET avg = avg * count/(count + 1) + :newValue / (count + 1), count = count + 1 WHERE id = :id

Сработает ли такой запрос правильно или он может сначала посчитать count, а потом avg? Если он срабатывает правильно, то похоже у меня накапливается ошибка вычислений с вещественными числами в среднем значении...
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 18.06.2014, 15:19   #2
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Порядок выполнения в Update

Сделал тест, SET выполняются по очереди (слева на право).
Странная у тебя там формула Average. Но ты можешь использовать ROUND(X, D) где D - степень точности для округления, например если D=2, то ROUND(0.0165, 2) == 0.02

А вообще лучше избегать любые "накопительные" операции с float числами где только возможно. Лучше пересчитать, чем накапливать.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (18.06.2014)
Старый 18.06.2014, 15:29   #3
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Порядок выполнения в Update

А есть другие варианты?

Я не храню инфу о всех элементах последовательности для среднего, поэтому исходя из текущего среднего и количества элементов мне надо получить новое добавляя новый элемент.

UPD: вероятно есть вариант использовать N последних чисел в последовательности. Например если N = 100, то будет примерно так:

UPDATE table_name SET avg = avg * (99/100) + :newValue / 100 WHERE id = :id

И не хранить count в таблице...
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 18.06.2014, 16:37   #4
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Порядок выполнения в Update

А сколько примерно будет записей для просчета общего? 10, 100, 1000?
Т.к. в SQL есть SUM, делать это каждый раз - может быть тяжеловато если слишком много записей, или если эта query часто выполняется.
(Offline)
 
Ответить с цитированием
Старый 18.06.2014, 17:58   #5
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Порядок выполнения в Update

Фактически это среднее время трассы, т.е. каждый финиш игроков на трассе будет фиксироваться. Я думаю будет не мене десятков тысяч
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 18.06.2014, 18:21   #6
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Порядок выполнения в Update

если каждое время фиксируется в базе, то не проще ли сначала посчитать сумму этого времени, а потом поделить ее на число записей в базе?
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
moka (18.06.2014)
Старый 18.06.2014, 18:25   #7
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Порядок выполнения в Update

HolyDel именно. Тем более статистика "сколько времени откатался" тоже приятная, и всего-то поделить на число раундов, и вот вам среднее.
(Offline)
 
Ответить с цитированием
Старый 18.06.2014, 18:54   #8
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Порядок выполнения в Update

Я наверное не так выразился, каждое время в плане среднего времени, если сохранять в базе все финиши игроков на трассах, та это просто ппц объемы будут.
К примеру 10 игроков, до финиша можно доехать за 30 секунд, заезд 20 минут. Т.е. в худшем случае на 10 игроков за заезд будет 400 финишей. И это только одна игра. А если будет одновременно играть несколько тысяч игроков (сотни заездов)?

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

Если хранить сумму всего времени и число финишей, то я не знаю на сколько большое число может получиться... я храню время целым числом в сотых долях секунды. 10 секунд это 1000 в бд.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 18.06.2014, 20:52   #9
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Порядок выполнения в Update

В UNSIGNED BIGINT вмещается 18446744073709551615 ужасно много (599,730,287,456 лет), так что не беспокойся, вместится.
(Offline)
 
Ответить с цитированием
Старый 18.06.2014, 21:42   #10
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Порядок выполнения в Update

вопще давать бонусы за среднее время карты, которое рассчитывается динамически от действий игроков, имхо, некорректно.

у тебя появятся 100500 твинков, которые будут спецом ехать медленно, чтобы мейны поулчали бонусы за проезд. тебе это надо? проедь трассу сам с рядом знакомых, посмотри ее время - оно пусть и будет бонусным.
если увидишь что бонусы падают слишком часто - уменьшаешь время на 3 секунды, слишком редко - увеличиваешь.
(Offline)
 
Ответить с цитированием
Старый 18.06.2014, 21:58   #11
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений
(для 9,330 пользователей)
Ответ: Порядок выполнения в Update

а лучше бонус если время лучше чем у 95% игроков (или другой процент)
__________________
(Offline)
 
Ответить с цитированием
Старый 18.06.2014, 22:01   #12
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Порядок выполнения в Update

Угу, бонус от статистического. Таким образом все могут получить бонус за хорошую езду, и будет честно - только лучшие.
Естественно нужен также бонус за 1/2/3 место, но это другое.
(Offline)
 
Ответить с цитированием
Старый 19.06.2014, 01:02   #13
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Порядок выполнения в Update

Уговорили, сделаю сумму времени в int64, а по поводу подсчета бонусов еще не решено все. Мне сейчас нужны данные, которые я смогу как-то использовать потом. Баланс довольно сложно придумать в заездах, где будут участвовать разные машины (по скорости и управляемости). Возможно все еще не один раз поменяется...
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 06:07.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com