Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
aign Member Откуда: Сообщений: 7 |
Здравствуйте. Помощи прошу ) Есть таблица , условно структура :
Нужно организовать цикл из 100 выборок из этой таблицы с учетом вероятности выпадения (столбец 2). То есть если у элемента "вероятности выпадения" = 60, то из 100 повторений этот элемент должен выбраться 60 раз. Всю голову сломал. Как это сделать ? |
||||
22 окт 12, 13:35 [13356312] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
А сумма ваших "вероятность выпадения" составляет 100 ? А то вдруг у вас там 2 значения и оба с вероятностью 60 |
||
22 окт 12, 13:38 [13356335] Ответить | Цитировать Сообщить модератору |
aign Member Откуда: Сообщений: 7 |
Да сумма всех вероятностей = 100 |
||||
22 окт 12, 13:39 [13356346] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37143 |
Сообщение было отредактировано: 22 окт 12, 13:40 |
||
22 окт 12, 13:39 [13356348] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Т.е. вам надо каждую запись из таблицы повторить столько раз, сколько задано в поле "вероятность выпадения" ? |
||
22 окт 12, 13:41 [13356368] Ответить | Цитировать Сообщить модератору |
aign Member Откуда: Сообщений: 7 |
А "честный рандом" осуществим средствами SQL ? Примем что используется MS SQL Server |
||||
22 окт 12, 13:42 [13356374] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
"честный рандом" основан на математической формуле. Например формуле равномерного распределения между двумя числами |
||
22 окт 12, 13:44 [13356385] Ответить | Цитировать Сообщить модератору |
aign Member Откуда: Сообщений: 7 |
Ну почти ) Всего должно быть проведено 1000 итераций, и выборка должна быть сформирована на основе поля "вероятность выпадения". Соответственно если вероятность 40, то из 1000 это значение должно быть выбрано 400 раз. |
||||
22 окт 12, 13:45 [13356393] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Ну так и генерируйте сразу 400 записей. про какой рандом вы говорите ? Количество записей для каждого "значение" будет равно число бросков*вероятность выпадения/100 |
||
22 окт 12, 13:48 [13356407] Ответить | Цитировать Сообщить модератору |
aign Member Откуда: Сообщений: 7 |
А как рандом привязать к вероятности выпадения ? (извините за глупый вопрос) |
||||
22 окт 12, 13:50 [13356423] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47047 |
а результирующий набор упорядочить в случайном порядке? |
||||
22 окт 12, 13:58 [13356508] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
И результат представить как "честный рандом" ) |
||
22 окт 12, 14:02 [13356546] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47047 |
SELECT TOP(100) T.Имя, T.значение FROM T JOIN master.dbo.spt_values V ON V.type='P' AND V.number<100*T.[вероятность выпадения] ORDER BY NEWID();Чувствую, что что-то не так, но пока не знаю что... |
22 окт 12, 14:05 [13356568] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47047 |
![]() |
||||
22 окт 12, 14:06 [13356578] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37143 |
declare @t table ( id int not null identity (1,1) , name varchar (100) not null , probability int not null , hits_count int not null , primary key ( id ) ) insert @t ( name , probability , hits_count ) select '1%', 1, 0 union all select '10% - 1', 10, 0 union all select '10% - 2', 10, 0 union all select '79%', 79, 0 declare @i int = 0 , @roll float while @i < 1000 begin set @i += 1 set @roll = rand() * 100 update a set a.hits_count += 1 from @t a where a.id = ( select a.id from ( select a.* , roll_till = a.roll_from + a.probability from ( select a.id , a.name , a.probability , roll_from = isnull ( (select sum(x.probability) from @t x where a.probability < x.probability or (a.probability = x.probability and a.id < x.id) ), 0 ) from @t a ) a ) a where @roll >= a.roll_from and @roll < a.roll_till ) end select * from @t Сообщение было отредактировано: 22 окт 12, 14:11 |
||||
22 окт 12, 14:10 [13356606] Ответить | Цитировать Сообщить модератору |
aign Member Откуда: Сообщений: 7 |
Спасибо, буду разбираться. |
||||
22 окт 12, 14:17 [13356661] Ответить | Цитировать Сообщить модератору |
Minamoto Member Откуда: Москва Сообщений: 1162 |
aign, ну вот такая выборка получается из 1000 рандомных чисел с учетом вероятности выпадения:declare @testtable table (name nvarchar(10), chance float(2), value int); insert into @testtable values ('Значение 1', 0.3, 1), ('Значение 2', 0.2, 2), ('Значение 3', 0.5, 3); with table1 as ( select t.name, cast(sum(t1.chance) as float(2)) as p_total, t.value from @testtable t join @testtable t1 on (t1.value <= t.value) group by t.name, t.value), table2 as ( select ABS(CAST(NEWID() AS binary(8)) %100/*maximum*/)/cast(100.00 as float(2)) as num from master..spt_values V where V.type='P' AND V.number<1000), result as ( select num, (select top 1 name from table1 where p_total > table2.num order by value asc) as name from table2) select name, COUNT(*) from result group by name |
22 окт 12, 18:00 [13358159] Ответить | Цитировать Сообщить модератору |
aign Member Откуда: Сообщений: 7 |
Вести с полей - задача усложнилась. Теперь сумма всех вероятностей гораздо больше 100%. для примера : Если случилось ДТП, то с 90% вероятностью будет разбит передний бампер, с 80% вероятностью будет разбита правая фара, с 70% вероятностью будет разбита левая фара, с 55% вероятностью будет помят капот и т.д. Надеюсь суть получилось понятно изложить. И в обсуждениях начинает всё чаще звучать "Метод Монте-карло" Короче тут уже какая-то статистика и оценка рисков начинается, что для меня вообще тёмный лес. |
25 окт 12, 07:56 [13372057] Ответить | Цитировать Сообщить модератору |
Добрый Э - Эх
Guest |
aign, ну, все ключевые слова у тебя есть. читай про сходимость по методу монте-карло. понятие "вероятность" замени на "вес" ("весовой коэффициент") и вперед!. :) Как вариант реализации на SQL можно посмотреть тут: тынц Оракловый синтаксис смущать не должен. Сейчас аналитика есть и в MS SQL Server-е. dbms_random.value - это в оракле такой генератор [псевдо]случайных чисел |
25 окт 12, 09:13 [13372212] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |