Имя: Пароль:
1C
 
Случайное распределение товара
,
0 AlexSTAL
 
09.07.15
14:46
Есть таблица значений:
Товар - Количество - Дата поставки

Подскажите алгоритм, применимый к сгенерированному случайному числу (от 1 до кол-во строк), что бы вероятность выбора товара в начале таблицы значений была выше, чем в конце, по логарифмическому принципу...
1 bootini
 
09.07.15
14:52
О_о

А что такое вероятность по логарифмическому принципу?

Хоть загуглю, приобщусь так сказать..
2 DTXqueque
 
09.07.15
14:55
(0) e^(-x)
3 AlexSTAL
 
09.07.15
14:56
(1) ну смысл то наверно понятен, а как это там математически или научно или ещё как называется я не знаю
4 Mikeware
 
09.07.15
14:58
(3) ПРВ - плотность распределения вероятности
5 DTXqueque
 
09.07.15
14:59
(КоличествоСтрок-1)*e^(-x)
6 Mikeware
 
09.07.15
15:01
(5) только диапазон прологарифмировать
7 AlexSTAL
 
09.07.15
15:02
(4) благодарю
8 AlexSTAL
 
09.07.15
15:02
(5) сейчас попробую
9 Ildarovich
 
09.07.15
16:37
(8) Мне кажется, законы распределения НЕПРЕРЫВНЫХ случайных величин к ДИСКРЕТНЫМ (номер строки ТЗ) будет неудобно применять. Да и реализация будет излишне трудоемкой.
Кроме того, в формуле не хватает лямбды (интенсивности). Без этого выбор последних строк в таблице значений будет исчезающе маловероятен.

Я бы обошелся более простой процедурой для МОДЕЛИРОВАНИЯ так распределенных случайных величин: нужно всего лишь задаться некоторой вероятностью 1/Лямда и по очереди генерировать случайные числа в диапазоне 0-1 для строки с первой по последней. Если очередное случайное число будет меньше заданной вероятности, останавливаться на выборе данной строки. Если никакая строка выбрана не будет - начинать цикл с начала.
Кажется, что рассчитав вероятность выбора по этой модели, получим приблизительно ту же формулу распределения.
10 AlexSTAL
 
09.07.15
16:51
(9) попытался представить - не смог
11 Casey1984
 
09.07.15
16:55
(0) Ну вот есть у тебя диапазон случайных величин - цылые числа от 0 до дофига, заведомо, на порядки больший чем количество строк в таблице. Разбей его на поддиапазоны по тому самому логарифмическому принципу и вперед.
12 samozvanec
 
09.07.15
17:01
(0) скажи, зачем? очень интересно
13 Mikeware
 
09.07.15
17:03
(11) в принципе, та же трансформация
14 Casey1984
 
09.07.15
17:04
(13) ага
15 AlexSTAL
 
09.07.15
17:13
(12) что бы генерировать расходную накладную и в приоритете списания всегда был залежавшийся товар
16 AlexSTAL
 
09.07.15
17:14
(11) можно пример... не пойму...
строк предположим 100
генерируем число от 1 до 1000
получаем 354, дальше что?
17 bolobol
 
09.07.15
17:35
(16)
- Помощник, приборы!
- 12!
- ...Что "12"??
- А что "приборы!"?
18 itlikbez
 
09.07.15
17:35
(16) Дальше логарифм этого числа, округление до целого - и вот тебе номер строки.
19 itlikbez
 
09.07.15
17:36
+(18) только для 100 строк число должно быть сильно больше чем 1000
20 Casey1984
 
09.07.15
17:37
(16) диапазон от 1 до 1000 (лучше больше) разбиваем на 100 интервалов (число строк) длина которых по необходимому тебе закону, дальше уже, например, при вхождении случайного числа в 3-й интервал выбираешь 3-ю строку.
21 Aleksey
 
09.07.15
17:41
Интересно, а как ты собираешься списывать товар без привязки к цене?  Или просто нужно списать 20 штук, а цена и наценка не важна?  Или весь товар у вас по одной цене (типа весь товар по 99 рублей
22 Гёдза
 
09.07.15
17:44
1. заполни веса по нужному алгоритму.
2. Посчитай сумму.
3. Бери случайное до этой суммы
4. по фифо доходи до нужной строки
5. вычитай из коэфф веса 1 (ну или другое количество)
23 Casey1984
 
09.07.15
17:44
(21) а может у него лотерея?
24 Aleksey
 
09.07.15
17:49
Это я к чему. Допустим нужно списать товар на 100 рублей. Твой алгоритм нашел 3 строку в которой цена товар 956 рублей, что превышает лимит, хотя в 25 строке есть товар по цене 95 .
Или задача списать 5 псевдослучайных позиций в 0
25 AlexSTAL
 
09.07.15
17:53
(all) Товар стоит не больше 200 рублей, списать нужно на сумму больше 100 000, посему только в самом конце можно столкнуться с проблемой стоимости товара.
26 beaver1971
 
09.07.15
17:55
Ну функцию СлучайноеЗначение(От, До) уже как нибудь сам ))))))

    КоличествоВариантовОтбора = 0;
    Для х = 1 До КоличествоСтрок Цикл
        КоличествоВариантовОтбора = КоличествоВариантовОтбора + Лог10(х) + 1;
    КонецЦикла;
    КоличествоВариантовОтбора = КоличествоВариантовОтбора * 2;
    // Случайные всё таки чаще к середине диапазона будут расположены...
    Случайное = СлучайноеЗначение(1, КоличествоВариантовВыбора);
    КоличествоВариантовОтбора = КоличествоВариантовОтбора / 2;
    Если Случайное > КоличествоВариантовОтбора Тогда
        КоличествоВариантовОтбора = Случайное - КоличествоВариантовОтбора;
    Иначе
        КоличествоВариантовОтбора = КоличествоВариантовОтбора - Случайное;
    КонецЕсли;
    Для х = 1 До КоличествоСтрок Цикл
        КоличествоВариантовОтбора = КоличествоВариантовОтбора - Лог10(х) - 1;
        Если КоличествоВариантовОтбора < 0 Тогда
            ИскомаяСтрока = х;
            Прервать;
        КонецЕсли;
    КонецЦикла;
27 Aleksey
 
09.07.15
17:57
Я еще вводил коэффициент -  максимальное количество в строке (актуально для рознице). Иначе если у тебя на складе 100500 штук какой нибудь позиции, то у тебя будет документ с одной строкой и с этой позицией
28 Ildarovich
 
09.07.15
20:11
+(8) совет в (8) касался экспоненциального распределения. Его часто путают с гораздо более популярным экспоненциальным. В (2) и (5) сделана та же ошибка.
Логарифмическое распределение - экзотика. В жизни трудно встретить то, что ему подчиняется. Поэтому постановка задачи выглядит надуманной. Тем не менее, если действительно нужно логарифмическое распределение, то вот модуль объекта обработки, которая решает именно эту задачу.
<code>Перем ГСЧ;

Перем МассивФункцииРаспределения Экспорт;

// https://en.wikipedia.org/wiki/Logarithmic_distribution

Функция Вероятность(К, Тэта)
    
    Возврат -1 / log(1 - Тэта) * Pow(Тэта, К) / К
    
КонецФункции

// все вероятности нарастающим итогом, послелнее значение - 1, это будет функция распределения

Функция Распределение(Тэта)
    
    Ответ = ТаблицаВыбора.ВыгрузитьКолонку(0);
    
    // табулируем вероятности
    
    Для ё = 1 По Ответ.Количество() Цикл
        Ответ[ё - 1] = Вероятность(ё, Тэта)
    КонецЦикла;
    
    ВГраница = Ответ.ВГраница();
    
    // наращиваем итог
    
    Для ё = 1 По ВГраница Цикл
        Ответ[ё] = Ответ[ё] + Ответ[ё - 1]
    КонецЦикла;
    
    // нужно нормировать, так как число строк в ТЗ ограничено в отличии от случая "классического" логарифмического распределения
    
    Для ё = 0 По ВГраница Цикл
        Ответ[ё] = Ответ[ё] / Ответ[ВГраница]
    КонецЦикла;
    
    Возврат Ответ    
    
КонецФункции

Функция ЛогарифмическоеСлучайноеЧисло() Экспорт
    
    Икс = ГСЧ.СлучайноеЧисло(0, 4294967295) / 4294967295;
    
    Для ё = 0 По МассивФункцииРаспределения.ВГраница() Цикл
        
        Если Икс <= МассивФункцииРаспределения[ё] Тогда
            Возврат ё + 1
        КонецЕсли
        
    КонецЦикла
    
КонецФункции

Процедура Подготовка() Экспорт

    МассивФункцииРаспределения = Распределение(Тэта);
    
КонецПроцедуры

ГСЧ = Новый ГенераторСлучайныхЧисел();</code>
29 Ildarovich
 
09.07.15
20:17
А вообще форум тут неудобный: ни картинки с гистограммой не приложить, ни обработки, ни сообщение отредактировать, ни код по нормальному отформатировать (((.
30 Asmody
 
10.07.15
10:03
(29) разработчики — казлы!
31 Остап Сулейманович
 
10.07.15
10:06
(30) Как я Вас понимаю... )))
ЗЫ. ничего личного. просто стеб.