|
|
|
Как выбрать случайную запись в справочнике? | ☑ | ||
|---|---|---|---|---|
|
0
oleg-vdgbu
09.03.11
✎
16:05
|
Вопрос новичка
Подскажите, 1) как выбрать в справочнике (пусть "А") случайную запись (не из формы) 2) как выбрать в табличной части выбранной записи справочника (пусть "А") случайную строку (не из формы) |
|||
|
1
zbv
09.03.11
✎
16:06
|
это где такие тесты ?
|
|||
|
2
Шпиндельная бабка
09.03.11
✎
16:06
|
(0) вопрос новичка в программировании ?
|
|||
|
3
Megas
09.03.11
✎
16:08
|
гляди
ГенераторСлучайныхЧисел |
|||
|
4
mikecool
09.03.11
✎
16:10
|
выбрать первые 1 Из Справочник...
|
|||
|
5
Megas
09.03.11
✎
16:14
|
(4) И где же это Случайная запись?
|
|||
|
6
Живой Ископаемый
09.03.11
✎
16:18
|
2(5) ну для клиент-серверных версий это будет в общем-то довольно случайно... :) но это случайного рода случайность...
|
|||
|
7
ptiz
09.03.11
✎
16:18
|
(5) Автор не уточнял вид случайного распределения, который ему нужен :)
|
|||
|
8
oleg-vdgbu
09.03.11
✎
16:25
|
(7) просто взятая наобум. В бытовом смысле - это не физика, не математика, характер распределения приплетать не будем.
|
|||
|
9
oleg-vdgbu
09.03.11
✎
16:26
|
А примерчик кода можно?
Желательно, почти работающего. |
|||
|
10
Maxus43
09.03.11
✎
16:29
|
А как кстати в 1с с генератором случайных чисел? помню ещё по "Бэйсикам" на спектруме и БК, он псевдослучаен, зависит от внутреннего таймера
|
|||
|
11
ThreeTONE
09.03.11
✎
16:29
|
(0) из ВДГБ ?
|
|||
|
12
deemok
09.03.11
✎
16:31
|
ПулучитьСтроку[ГенераторСлучайныхЧисел]
|
|||
|
13
andrewks
09.03.11
✎
16:31
|
(10) как бы он везде псевдо-случаен
|
|||
|
14
luns
09.03.11
✎
16:31
|
(0) надо случайным образом генерить гуид а потом искать его в справочнике.
если нашел, то ура. |
|||
|
15
aleks-id
09.03.11
✎
16:32
|
Запрос = Новый Запрос();
Запрос.Текст = "ВЫБРАТЬ | Количество(Номенклатура.Ссылка) Как КолВо |ИЗ | Справочник.Номенклатура КАК Номенклатура"; МаксСпр = Запрос.Выполнить().Выгрузить()[0].КолВо; ГСЧ = Новый ГенераторСлучайныхЧисел(); Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | Номенклатура.Ссылка КАК РандомныйСПР |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.Код ПОДОБНО ""%"" + &Код + ""%"" "; Запрос.УстановитьПараметр("Код", СокрЛП(ГСЧ.СлучайноеЧисло(1, МаксСпр))); Пока Запрос.Выполнить().Пустой() Цикл Запрос.УстановитьПараметр("Код", СокрЛП(ГСЧ.СлучайноеЧисло(1, МаксСпр))); КонецЦикла; Сообщить(Запрос.Выполнить().Выгрузить()[0].РандомныйСПР); |
|||
|
16
Megas
09.03.11
✎
16:33
|
Можно так
Запрос = новый Запрос(); Запрос.Текст = "ВЫБРАТЬ | РеализацияТоваров.Ссылка КАК Ссылка |ИЗ | Документ.РеализацияТоваров КАК РеализацияТоваров | |УПОРЯДОЧИТЬ ПО | Ссылка"; ВсеРеализации = Запрос.Выполнить().Выгрузить(); ГСЧ = новый ГенераторСлучайныхЧисел(); СлучайноеЧисло = ГСЧ.СлучайноеЧисло(0, ВсеРеализации.Количество()-1); Документ = ВсеРеализации[СлучайноеЧисло].ССылка; СлучайноеЧисло = ГСЧ.СлучайноеЧисло(0, Документ.Товары.Количество()-1); СтрокаТаблицы = Документ.Товары[СлучайноеЧисло]; |
|||
|
17
andrewks
09.03.11
✎
16:35
|
(14) жесть. а если не найдёт?
|
|||
|
18
aleks-id
09.03.11
✎
16:35
|
(16) блин чото не додумался в ТЗ вывалить все и оттуда случайно выбирать :)
|
|||
|
19
deemok
09.03.11
✎
16:36
|
может зависнуть в поиске(14)
|
|||
|
20
aleks-id
09.03.11
✎
16:36
|
+(18) хотя если документов или элементов справочника дофига - твой вариант дольше работает и отжирает больше памяти ;)
|
|||
|
21
Megas
09.03.11
✎
16:40
|
(20)ИМХО Незначительно...
|
|||
|
22
luns
09.03.11
✎
16:53
|
(17) )))) повелся.
|
|||
|
23
Alexandr Puzakov
09.03.11
✎
16:59
|
Накуя тащить целый справочник в память?
|
|||
|
24
el-gamberro
09.03.11
✎
17:00
|
Используй оператор TABLESAMPLE
|
|||
|
25
el-gamberro
09.03.11
✎
17:02
|
Если необходима действительно случайная выборка отдельных строк, следует изменить запрос так, чтобы он отфильтровывал строки по случайному признаку, не используя TABLESAMPLE. Например, следующий запрос использует функцию NEWID для возвращения примерно одного процента строк из таблицы Sales.SalesOrderDetail.
SELECT * FROM Sales.SalesOrderDetail WHERE 0.01 >= CAST(CHECKSUM(NEWID(), SalesOrderID) & 0x7fffffff AS float) / CAST (0x7fffffff AS int) Столбец SalesOrderID включен в выражение CHECKSUM, позволяя вычислять функцию NEWID() для каждой из строк для выполнения построчной выборки. Результатом выражения CAST(CHECKSUM(NEWID(), SalesOrderID) & 0x7fffffff AS float / CAST (0x7fffffff AS int) является случайное значение типа float в диапазоне от 0 до 1. |
|||
|
26
Megas
09.03.11
✎
17:06
|
(23)Жду ваш пример.
|
|||
|
27
Megas
09.03.11
✎
17:16
|
Без ТЗ но с перебором.
Перем ин; Запрос = новый Запрос(); Запрос.Текст = "ВЫБРАТЬ | РеализацияТоваров.Ссылка КАК Ссылка |ИЗ | Документ.РеализацияТоваров КАК РеализацияТоваров | |УПОРЯДОЧИТЬ ПО | Ссылка"; Выборка = Запрос.Выполнить().Выбрать(); ГСЧ = новый ГенераторСлучайныхЧисел(); СлучайноеЧисло = ГСЧ.СлучайноеЧисло(0, Выборка.Количество()-1); ин = 0; Пока Выборка.Следующий() цикл Если ин =СлучайноеЧисло тогда Документ = Выборка.ССылка; Прервать; КонецЕсли; ин=ин+1; КонецЦикла; СлучайноеЧисло = ГСЧ.СлучайноеЧисло(0, Документ.Товары.Количество()-1); СтрокаТаблицы = Документ.Товары[СлучайноеЧисло]; |
|||
|
28
НЕА123
09.03.11
✎
17:29
|
(23)
типа так: Запрос = новый Запрос(); Запрос.Текст = СтрЗаменить( "ВЫБРАТЬ ПЕРВЫЕ 1 | ВложенныйЗапрос.Ссылка |ИЗ | (ВЫБРАТЬ ПЕРВЫЕ #СлучайноеЧисло | Контрагенты.Ссылка КАК Ссылка | ИЗ | Справочник.Контрагенты КАК Контрагенты | | УПОРЯДОЧИТЬ ПО | Контрагенты.Код) КАК ВложенныйЗапрос | |УПОРЯДОЧИТЬ ПО | ВложенныйЗапрос.Ссылка.Код УБЫВ", #СлучайноеЧисло, СлучайноеЧислоОт1ДоКолваЭлементов) |
|||
|
29
Megas
09.03.11
✎
17:32
|
СлучайноеЧислоОт1ДоКолваЭлементов - откуда узнаешь?
|
|||
|
30
НЕА123
09.03.11
✎
17:36
|
Запрос.Текст = "ВЫБРАТЬ
| КОЛИЧЕСТВО(*) КАК Колво |ИЗ | Справочник.Контрагенты КАК Контрагенты"; Выборка = Запрос.ВыполНить().Выбрать(); Выборка.Следующий(); ГСЧ = новый ГенераторСлучайныхЧисел(); СлучайноеЧислоОт1ДоКолваЭлементов = ГСЧ.СлучайноеЧисло(1, Выборка.Колво); |
|||
|
31
Megas
09.03.11
✎
17:38
|
(30) Что быстрее будет?
(27) или (30) ... надо замерять А уж если Рандом выдаст последнюю запись то (27) явно быстрее |
|||
|
32
НЕА123
09.03.11
✎
17:38
|
+(30)
собственно, алгоритм взят из (27). |
|||
|
33
НЕА123
09.03.11
✎
17:41
|
(31)
насчет быстроты не думал. в (27) ответ на (23). |
|||
|
34
Alexandr Puzakov
09.03.11
✎
17:58
|
Процедура ПолучитьСлучайныйЭлемент() Экспорт
ГСЧ = Новый ГенераторСлучайныхЧисел; СлучайноеЧисло = ГСЧ.СлучайноеЧисло(0, 50); //80, 100... Выборка = Справочники.СотрудникиОрганизаций.Выбрать(); Найден = Ложь; Пока НЕ Найден Цикл Выборка.Следующий(); ТекущееЧисло = ГСЧ.СлучайноеЧисло(0, 50); Если ТекущееЧисло = СлучайноеЧисло Тогда Найден = Истина; Сообщить(Выборка.Наименование); КонецЕсли; КонецЦикла; КонецПроцедуры Возможно, работать будет немного подольше. Зато можно не бояться за память. |
|||
|
35
Alexandr Puzakov
09.03.11
✎
18:03
|
Гоню, работать будет быстрее полного перегрибания справочника. Особенно разность будет заметна при массовом "генерировании" случайных элементов.
|
|||
|
36
supremum
09.03.11
✎
18:08
|
(34) Не очень. Предположим, что в справочнике 10000 элементов и нужно выбрать случайный, тогда вероятность совпадения двух случайных чисел будет равна 10^8 степени. Проще тогда уж просто справочник перебирать.
|
|||
|
37
acsent
09.03.11
✎
18:09
|
Нужно выбрать 1 раз или несколько?
Если всего один раз, то первую |
|||
|
38
Alexandr Puzakov
09.03.11
✎
18:12
|
(36) а кто сказал, что нужно генерировать числа от 1 до 10000? Вполне достаточно будет генерировать от 1 до 100 ;)
При 10000 элементов, в случае "простой выборки" нужно будет сначала все выбрать, а потом из выборки вытянуть нужный. В моем же случае выборка может остановиться на 112-м, 345-м или 7-м элементе, весь справочник перебираться не будет ;) Давайте поэкспериментируем. |
|||
|
39
Alexandr Puzakov
09.03.11
✎
18:17
|
+(38) фишка в том, что в моем случае в память не потянется весь справочник, там будут только "порции выборки", плюс обработка может остановиться в любой момент, как только числа совпадут.
|
|||
|
40
supremum
09.03.11
✎
18:18
|
(38) Ок, необязательно. Но тогда в (34) алгоритм вообще использовать нельзя, т. к. существует вероятность, что второе число не будет сгенерировано совпадающим с первым.
|
|||
|
41
Alexandr Puzakov
09.03.11
✎
18:20
|
(40) при небольших числах (менее 100) обязательно совпадет. На крайняк выберется последний элемент, который дальше перебирать уже некуда будет.
|
|||
|
42
Alexandr Puzakov
09.03.11
✎
18:21
|
+(41) я проверил, у меня на 30-40 выполнений процедуры все работало.
|
|||
|
43
Alexandr Puzakov
09.03.11
✎
18:29
|
Тысяча случайных элементов справочника из демобазы ЗУП у меня выбралось за 4 секунды.
|
|||
|
44
supremum
09.03.11
✎
18:41
|
(41) Совсем необязательно.
Вероятность, что в серии из n испытаний не выпадет число от 1 до m будет равна (1-1/m)^n, что есть величина больше нуля. |
|||
|
45
Alexandr Puzakov
09.03.11
✎
18:45
|
(44) сейчас проведу эксперимент и все наглядно покажу
|
|||
|
46
Alexandr Puzakov
09.03.11
✎
19:31
|
Вот тест:
http://ifolder.ru/22310502 |
|||
|
47
oleg-vdgbu
09.03.11
✎
21:40
|
Вопрос:
а если просто сделать проиндексировать целым числом записи, а потом взять случайное число от количества элементов (= последний отсчитанный индекс). Если нужен не один случайный элемент, а скажем 1/3 кол-во содержимого справочника взятое наобум (с возможными повторениями), то затрата времени на индексирование, по-моему, окупиться. |
|||
|
48
Alexandr Puzakov
10.03.11
✎
06:21
|
(47) ну сделай. Проблема в чем?
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |