Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выборка с учётом вероятности.  [new]
aign
Member

Откуда:
Сообщений: 7
Здравствуйте. Помощи прошу )
Есть таблица , условно структура :
Имя вероятность выпадения значение


Нужно организовать цикл из 100 выборок из этой таблицы с учетом вероятности выпадения (столбец 2).
То есть если у элемента "вероятности выпадения" = 60, то из 100 повторений этот элемент должен выбраться 60 раз.

Всю голову сломал. Как это сделать ?
22 окт 12, 13:35    [13356312]     Ответить | Цитировать Сообщить модератору
 Re: Выборка с учётом вероятности.  [new]
Glory
Member

Откуда:
Сообщений: 104760
aign
Нужно организовать цикл из 100 выборок из этой таблицы с учетом вероятности выпадения (столбец 2).
То есть если у элемента "вероятности выпадения" = 60, то из 100 повторений этот элемент должен выбраться 60 раз.

А сумма ваших "вероятность выпадения" составляет 100 ?
А то вдруг у вас там 2 значения и оба с вероятностью 60
22 окт 12, 13:38    [13356335]     Ответить | Цитировать Сообщить модератору
 Re: Выборка с учётом вероятности.  [new]
aign
Member

Откуда:
Сообщений: 7
Glory
aign
Нужно организовать цикл из 100 выборок из этой таблицы с учетом вероятности выпадения (столбец 2).
То есть если у элемента "вероятности выпадения" = 60, то из 100 повторений этот элемент должен выбраться 60 раз.

А сумма ваших "вероятность выпадения" составляет 100 ?
А то вдруг у вас там 2 значения и оба с вероятностью 60

Да сумма всех вероятностей = 100
22 окт 12, 13:39    [13356346]     Ответить | Цитировать Сообщить модератору
 Re: Выборка с учётом вероятности.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37143
aign
То есть если у элемента "вероятности выпадения" = 60, то из 100 повторений этот элемент должен выбраться 60 раз
Гарантированное количество выпадений дадут вероятности 0% и 100%. Остальное - рандом, если вы, конечно, будете использовать "честный рандом".

Сообщение было отредактировано: 22 окт 12, 13:40
22 окт 12, 13:39    [13356348]     Ответить | Цитировать Сообщить модератору
 Re: Выборка с учётом вероятности.  [new]
Glory
Member

Откуда:
Сообщений: 104760
aign
Да сумма всех вероятностей = 100

Т.е. вам надо каждую запись из таблицы повторить столько раз, сколько задано в поле "вероятность выпадения" ?
22 окт 12, 13:41    [13356368]     Ответить | Цитировать Сообщить модератору
 Re: Выборка с учётом вероятности.  [new]
aign
Member

Откуда:
Сообщений: 7
Гавриленко Сергей Алексеевич
aign
То есть если у элемента "вероятности выпадения" = 60, то из 100 повторений этот элемент должен выбраться 60 раз
Гарантированное количество выпадений дадут вероятности 0% и 100%. Остальное - рандом, если вы, конечно, будете использовать "честный рандом".


А "честный рандом" осуществим средствами SQL ?
Примем что используется MS SQL Server
22 окт 12, 13:42    [13356374]     Ответить | Цитировать Сообщить модератору
 Re: Выборка с учётом вероятности.  [new]
Glory
Member

Откуда:
Сообщений: 104760
aign
А "честный рандом" осуществим средствами SQL ?

"честный рандом" основан на математической формуле.
Например формуле равномерного распределения между двумя числами
22 окт 12, 13:44    [13356385]     Ответить | Цитировать Сообщить модератору
 Re: Выборка с учётом вероятности.  [new]
aign
Member

Откуда:
Сообщений: 7
Glory
aign
Да сумма всех вероятностей = 100

Т.е. вам надо каждую запись из таблицы повторить столько раз, сколько задано в поле "вероятность выпадения" ?


Ну почти ) Всего должно быть проведено 1000 итераций, и выборка должна быть сформирована на основе поля "вероятность выпадения". Соответственно если вероятность 40, то из 1000 это значение должно быть выбрано 400 раз.
22 окт 12, 13:45    [13356393]     Ответить | Цитировать Сообщить модератору
 Re: Выборка с учётом вероятности.  [new]
Glory
Member

Откуда:
Сообщений: 104760
aign
Ну почти ) Всего должно быть проведено 1000 итераций, и выборка должна быть сформирована на основе поля "вероятность выпадения". Соответственно если вероятность 40, то из 1000 это значение должно быть выбрано 400 раз.

Ну так и генерируйте сразу 400 записей. про какой рандом вы говорите ?
Количество записей для каждого "значение" будет равно
число бросков*вероятность выпадения/100
22 окт 12, 13:48    [13356407]     Ответить | Цитировать Сообщить модератору
 Re: Выборка с учётом вероятности.  [new]
aign
Member

Откуда:
Сообщений: 7
Гавриленко Сергей Алексеевич
aign
То есть если у элемента "вероятности выпадения" = 60, то из 100 повторений этот элемент должен выбраться 60 раз
Гарантированное количество выпадений дадут вероятности 0% и 100%. Остальное - рандом, если вы, конечно, будете использовать "честный рандом".


А как рандом привязать к вероятности выпадения ? (извините за глупый вопрос)
22 окт 12, 13:50    [13356423]     Ответить | Цитировать Сообщить модератору
 Re: Выборка с учётом вероятности.  [new]
iap
Member

Откуда: Москва
Сообщений: 47047
aign
Гавриленко Сергей Алексеевич
пропущено...
Гарантированное количество выпадений дадут вероятности 0% и 100%. Остальное - рандом, если вы, конечно, будете использовать "честный рандом".


А как рандом привязать к вероятности выпадения ? (извините за глупый вопрос)
Наверно, надо выбрать каждую строку записанное в неё количество раз,
а результирующий набор упорядочить в случайном порядке?
22 окт 12, 13:58    [13356508]     Ответить | Цитировать Сообщить модератору
 Re: Выборка с учётом вероятности.  [new]
Glory
Member

Откуда:
Сообщений: 104760
iap
Наверно, надо выбрать каждую строку записанное в неё количество раз,
а результирующий набор упорядочить в случайном порядке?

И результат представить как "честный рандом" )
22 окт 12, 14:02    [13356546]     Ответить | Цитировать Сообщить модератору
 Re: Выборка с учётом вероятности.  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Выборка с учётом вероятности.  [new]
iap
Member

Откуда: Москва
Сообщений: 47047
Glory
iap
Наверно, надо выбрать каждую строку записанное в неё количество раз,
а результирующий набор упорядочить в случайном порядке?

И результат представить как "честный рандом" )
Честного не получится! Псевдочестный
22 окт 12, 14:06    [13356578]     Ответить | Цитировать Сообщить модератору
 Re: Выборка с учётом вероятности.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37143
aign
Гавриленко Сергей Алексеевич
пропущено...
Гарантированное количество выпадений дадут вероятности 0% и 100%. Остальное - рандом, если вы, конечно, будете использовать "честный рандом".


А как рандом привязать к вероятности выпадения ? (извините за глупый вопрос)
Как-то так:

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]     Ответить | Цитировать Сообщить модератору
 Re: Выборка с учётом вероятности.  [new]
aign
Member

Откуда:
Сообщений: 7
Гавриленко Сергей Алексеевич
aign
пропущено...


А как рандом привязать к вероятности выпадения ? (извините за глупый вопрос)
Как-то так:

Some SQL


Спасибо, буду разбираться.
22 окт 12, 14:17    [13356661]     Ответить | Цитировать Сообщить модератору
 Re: Выборка с учётом вероятности.  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Выборка с учётом вероятности.  [new]
aign
Member

Откуда:
Сообщений: 7
Вести с полей - задача усложнилась. Теперь сумма всех вероятностей гораздо больше 100%.

для примера : Если случилось ДТП, то

с 90% вероятностью будет разбит передний бампер,
с 80% вероятностью будет разбита правая фара,
с 70% вероятностью будет разбита левая фара,
с 55% вероятностью будет помят капот

и т.д. Надеюсь суть получилось понятно изложить.

И в обсуждениях начинает всё чаще звучать "Метод Монте-карло"
Короче тут уже какая-то статистика и оценка рисков начинается, что для меня вообще тёмный лес.
25 окт 12, 07:56    [13372057]     Ответить | Цитировать Сообщить модератору
 Re: Выборка с учётом вероятности.  [new]
Добрый Э - Эх
Guest
aign,

ну, все ключевые слова у тебя есть. читай про сходимость по методу монте-карло. понятие "вероятность" замени на "вес" ("весовой коэффициент") и вперед!. :)

Как вариант реализации на SQL можно посмотреть тут: тынц
Оракловый синтаксис смущать не должен. Сейчас аналитика есть и в MS SQL Server-е. dbms_random.value - это в оракле такой генератор [псевдо]случайных чисел
25 окт 12, 09:13    [13372212]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить