Имя: Пароль:
1C
1С v8
v8: Выбрать два случайных элемента справочника
0 Nesh
 
16.01.12
20:19
Как лучше всего реализовать сабж?
1 Господин ПЖ
 
16.01.12
20:20
метаданные
2 Nesh
 
16.01.12
20:22
(1) не правильно написал: два случайных элемента справочника.
3 rotting
 
16.01.12
20:23
генератором случайных чисел))))
4 rs_trade
 
16.01.12
20:24
(2) СлучайноеЧисло(<НижнийДиапазон>, <ВерхнийДиапазон>)

код сгенерировать
5 Nesh
 
16.01.12
20:26
(4) мне надо выбрать два случайных элемента. у меня 10 элементов, допустим, и очень высока вероятность, что два элемента будут одинаковыми таким способом.
6 rs_trade
 
16.01.12
20:27
(5) в цикле, пока не станут разными.
7 vicof
 
16.01.12
20:28
+(6) или убирать из списка уже найденные
8 Nesh
 
16.01.12
20:28
(6) тоже есть вероятность зацикливания
9 БалбесВ1с
 
16.01.12
20:29
Первые 2
Различные
10 rs_trade
 
16.01.12
20:30
(8) Не думаю. Генератор будет выдавать все время одно и то же значение?
11 Nesh
 
16.01.12
20:33
(9) та не, всегда будет одно и тоже возвращать
(7) ну ок, допустим такой вариант подходит.
далее как реализовываем алгоритм.
допустим делаем выборку всех элементов,
добавляем в массив элементов, потом СлучайноеЧисло(0,Массив.Количество()-1); определяет наш случайный элемент,
удаляю его из массива и далее опять СлучайноеЧисло(0,Массив.Количество()-2);
определяем второй случайный элемент.
но хотелось бы красиво решить задачу. одним запросом.
12 Nesh
 
16.01.12
20:34
(10) для 10 элементов вероятность низкая, но для 3 очень высока что из цикла долго не будет выходить.
13 truba
 
16.01.12
20:35
Два одинаковых это между тем случайные. А вот два разных это случайные с условием
14 rs_trade
 
16.01.12
20:38
Число1 = 0;
   Число2 = 0;
   
   НачальноеЧисло = Секунда(ТекущаяДата());
   
   ГСЧ = Новый ГенераторСлучайныхЧисел(НачальноеЧисло);
   

   Пока Истина Цикл
       Число1 = ГСЧ.СлучайноеЧисло(0, 10);
       Число2 = ГСЧ.СлучайноеЧисло(0, 10);
       
       Если Число1 <> Число2 Тогда
           Прервать;
       КонецЕсли;
   КонецЦикла;
   
   Сообщить(Число1);
   Сообщить(Число2);
15 Живой Ископаемый
 
16.01.12
20:40
2(12) "но для 3 очень высока что из цикла долго не будет выходит" - это просто смешно? долго это сколько - несколько минут? или 10 итераций, которые выполнятся за доли секунды?
16 Nesh
 
16.01.12
20:42
(15) теоретически есть вероятность что будет зацикливание на неопределенное кол. итераций, этого уже достаточно.
если есть решение получше...
17 truba
 
16.01.12
20:45
(16) ну есть. Выносишь неиспользованные коды в некий массив, откуда удаляешь уже использованные. Выбираешь случайно из остатков
18 truba
 
16.01.12
20:45
гарантировано не будет цикла. При больших объемах гарантировано будут тормоза
19 truba
 
16.01.12
20:48
или так.
шаг первый. Выбор случайного числа. это первый элемент = ПЭ
шаг второй - выбор да или нет. случайно.
Шаг третий - отнять от первого числа случайное число между 1 и ПЭ если да, или если нет то прибавить к ПЭ случайное число от 1 до конца справочника - ПЭ.
20 truba
 
16.01.12
20:50
но в (19) жуткая псевдослучайность. Понятно что шансы выпасть элементу в более коротком отрезке гораздо выше. Ну тогда ДА или НЕТ (вверх или вниз) выбирать с коэффициентом отношения длин этих отрезков. Тут сам придумай. Так будет честно
21 Nesh
 
16.01.12
20:52
(20) спасибо.
22 rs_trade
 
16.01.12
20:53
(16) что будет зацикливание на неопределенное кол. итераций, этого уже достаточно.

ну будет 2-3 итерации, и что? проблема в чем?
23 truba
 
16.01.12
20:55
вот еще вариант. Зациклить систему.
1) выбор случайного числа. Второе.Выбор случайного числа из первого диапазона -1. И прибавить к первому зациклив систему. Т.е. если переполнение то будет снова с первого. При этом ты гарантировано не уткнешься в первый, т.е. -1. Ну графически легко нарисовать, представь что все элементы стоят как бы по кругу и ты случайно выбираешь добавление.
24 truba
 
16.01.12
20:59
короче вот пример. семь элементов.
Первый выбор от 1го до 7 -> 5.
Второй выбор. от 1го до 6 -> 3. (Пусть даже до 10ти! мы отнимем от разряда то ;)
5+3 = 8мь -> 1 (т.к. -7 элементов - зацикливание)
быстро и надежно и случайно.
25 truba
 
16.01.12
21:00
что в скобках не читать - ахинея
26 truba
 
16.01.12
21:00
в первых, в смысле скобках ))))))))))) все пошел домой
27 truba
 
16.01.12
21:07
28 Гот
 
16.01.12
21:09
МассивСлучайныхЭлементов = Новый Массив;
Для Счетчик = 1 По КоличествоНужныхЭлементов Цикл
Бинго = Ложь;
Пока Не Бинго Цикл
Уид = Новый УникальныйИдеетификатор;
Ссылка  = СправочникМенеджер.КакТамПолучитьПоУиду(Уид);
Если СтрНайти(Строка(Ссылка),"<Объект не найден>") = 0 Тогда
МассивСлучайныхЭлементов.Добавить(Ссылка);
Бинго = Истина;
КонецЦикла;
КонецЦикла;

Возврат МассивСлучайныхЭлементов;
29 Гот
 
16.01.12
21:10
Тяжело на IPhone код 1С писать :)
30 rs_trade
 
16.01.12
21:13
(28) зачет! останется только подождать пару триллионов лет пока цикл закончится.
31 Гот
 
16.01.12
21:22
(30) Время выполнения тем меньше, чем больше элементов справочника. При определенном количестве элементов запрос будет выполняться достаточно быстро.
32 rs_trade
 
16.01.12
21:28
(31) С этим согласен. А если в справочнике содержатся элементы с гуидами от 0 до FFF..n. То будет вообще по одной итерации, для каждого значения. Круто же.
33 rs_trade
 
17.01.12
11:58
Можно кстати упростить код в (28)

МассивСлучайныхЭлементов = Новый Массив;
Для Счетчик = 1 По КоличествоНужныхЭлементов Цикл
Бинго = Ложь;
Пока Не Бинго Цикл

КонецЦикла;
КонецЦикла;

Возврат МассивСлучайныхЭлементов;

Будет тоже самое.