|
Случайное распределение товара | ☑ | ||
---|---|---|---|---|
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) Как я Вас понимаю... )))
ЗЫ. ничего личного. просто стеб. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |