|
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 По КоличествоНужныхЭлементов Цикл Бинго = Ложь; Пока Не Бинго Цикл КонецЦикла; КонецЦикла; Возврат МассивСлучайныхЭлементов; Будет тоже самое. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |