Имя: Пароль:
1C
1С v8
,чтобы в последовательности числа не повторялись
,
0 YamEgor
 
15.11.20
11:25
добрый день! подскажите как можно отследить повторение чисел? есть задание: "Сгенерировать последовательность из 20 случайных чисел в диапазоне от 0 до 30, при условии, чтобы в последовательности числа не повторялись."
      Массив = Новый Массив();
      Генератор = Новый ГенераторСлучайныхЧисел();
      Для Сч = 1 По 20 Цикл
          Массив.Добавить(Генератор.СлучайноеЧисло(0,30));
      КонецЦикла;
      
      Для каждого Значение Из Массив Цикл
           Сообщить(Значение);
      КонецЦикла;
      
но числа повторяются. Как можно сделать проверку?
1 ДенисЧ
 
15.11.20
11:29
МойМассив = Новый Массив();
      Генератор = Новый ГенераторСлучайныхЧисел();
Пока истина цикл
  ч = Генератор.СлучайноеЧисло(0,30);
  Пока МойМассив.найти(ч) <> Неопределено цикл
    ч = Генератор.СлучайноеЧисло(0,30);
  КонецЦикла;
   МойМассив.Добавить(ч);
   Если МойМассив.Количество() >= 20 Тогда
     Прервать;
  КОенцЕсли
КОнеЦикла;
2 YamEgor
 
15.11.20
11:33
(1) Спасибо!
3 ДНН
 
15.11.20
11:59
(0) =)
МассивЧисел = Новый Массив;
Для ё = 1 По 20 Цикл
    МассивЧисел.Добавить(ё);    
КонецЦикла;
4 rphosts
 
15.11.20
12:03
(3) не  случайные
5 rphosts
 
15.11.20
12:03
+ (4) и да, использование литеры "ё" в 1С моветон
6 ДНН
 
15.11.20
12:19
(5) "использование литеры "ё" в 1С моветон" - Почему? Как правильно называть? Счетчик?
7 acht
 
15.11.20
12:42
(6) > Счетчик
Именно. В 7.7 в языке запросов была как раз такая функция, но через "ё". От лучей поноса разработчики платформы еще не отмылись.
8 RomanYS
 
15.11.20
13:19
(1) а если надо будет 990 из 0..1000 набрать, так же будешь делать?
9 rphosts
 
15.11.20
13:21
(7) ээээ, а можно поподробнее, а то впервые слышу
10 ДенисЧ
 
15.11.20
14:02
(9) про ё или про лучи?
(8) комп железный, ему пофигу
11 Ненавижу 1С
 
гуру
15.11.20
14:05
немного оптимизировал:

Процедура ЗаполнениеМассива() Экспорт

    ГСЧ = Новый ГенераторСлучайныхЧисел();
    
    ИсходныйМассив = Новый Массив(ПределЧисел);
    Для й=1 По ПределЧисел Цикл
        ИсходныйМассив[й-1] = й;    
    КонецЦикла;
    
    Результат = Новый Массив(ДлинаМассива);
    Для й=1 По ДлинаМассива Цикл
        
        Индекс = ГСЧ.СлучайноеЧисло(0,ПределЧисел-й);
        Результат[й-1] = ИсходныйМассив[Индекс];
        ИсходныйМассив.Удалить(Индекс);
        
    КонецЦикла;
    
    Для й=1 По ДлинаМассива Цикл
        
        Сообщить(Результат[й-1]);
        
    КонецЦикла;

КонецПроцедуры
12 Asmody
 
15.11.20
14:13
Через Соответствие не быстрей ли будет? (на 20 шагах без разницы, это понятно, а на 20 млн?)
13 Ненавижу 1С
 
гуру
15.11.20
14:17
(12) чему там ускоряться в (11)? Поиска ключей вроде нет, элемент массива по индексу получается за О(1)
14 RomanYS
 
15.11.20
14:31
(10) комп железный, люди не железные могут не дождаться
(11) ага, это уже похоже на решение
(13) +100500
15 rphosts
 
15.11.20
14:59
(12) Соответствие жуткий тормоз
16 rphosts
 
15.11.20
14:59
(10) про "ё"
17 ДенисЧ
 
15.11.20
15:11
(16) Была такая функция Счётчик() в языке запросов.
А поскольку грамотнорусских 1сников маловато, её часто писали как Счетчик(). И ловили непонятную, на их взгляд, ошибку.
18 Said_We
 
15.11.20
15:11
(0) если диапазон от 0 до 30 и надо взять почти все, Т. Е. 20, то значит исключить надо всего 10. Значит надо не повторяющиеся искать всего 10 их исключить и остальные взять. Так быстрее. И не важно какой алгоритм.
19 Said_We
 
15.11.20
15:15
На телефоне трындец писать. Задача решается от обратного. Искать надо те числа, которые необходимо исключить. Их просто меньше по количеству. Так задача быстрее решается.
20 acht
 
15.11.20
15:16
(9) Функция <?> = ();
Синтаксис:
Функция <ИмяФункции> = <ТипФункции>(<Параметр>|<УточненныйПараметр>) [Когда(<Условие>)];
Англоязычный синоним:
Function <ИмяФункции> = <ТипФункции>(<Параметр>|<УточненныйПараметр>) [When(<Условие>)];
Назначение:
Вычислить функцию и включить ее результат в запрос.
Параметры:
<ИмяФункции> - имя, присваиваемое функции;
<ТипФункции> - ключевое слово одной из встроенных функций языка;
<Параметр> - имя внутренней переменной, параметр вызова функции;
<УточненныйПараметр> - конкретизация внутренней переменной, параметр вызова функции.
<Условие> - условие вычисления функции (необязательно).
Замечание:
Типы встроенных функций:
Сумма (Sum) - сумма значений параметра;
Среднее (Avg) - среднее значений параметра;
Минимум (Min) - минимум значений параметра;
Максимум (Max) - максимум значений параметра;
НачОст (BegRest) - начальный остаток значений параметра-ресурса Регистра;
КонОст (EndRest) - конечный остаток значений параметра-ресурса Регистра;
Приход (Debit) - приход значений параметра-ресурса Регистра;
Расход (Credit) - расход значений параметра-ресурса Регистра;
Счётчик (Counter) - количество записей, вошедших в выборку, <Параметр> - не нужен;
СНД, СКД, СНК, СКК (IDB, FDB, ICD, FCD) - сальдо начальное или конечное по дебету или кредиту;
ДО, КО, КорДо, КорКо (TD, TC, CorTD, CorTC) - обороты по дебету или кредиту счета или корсчета;
В функциях: Сумма, Среднее, Максимум, Минимум в качестве аргумента возможно использование арифметического выражения в терминах встроенного языка.
К параметрам, указывающим на ресурсы Регистров, могут применяться только оговоренные функции.
Подробнее см. в документации, глава ''Язык Генерации Запросов''
21 acht
 
15.11.20
15:16
Вот "Counter" которая, она как раз через ё и писалась - "Счётчик"
22 rphosts
 
15.11.20
15:21
(17) (20) прикольно... как-бэ на клюшках очень много кодил... не было такой проблемы...
23 acht
 
15.11.20
15:22
(17) >  грамотнорусских 1сников маловато
Точно. А потом они захвалили власть и https://its.1c.ru/db/v8std#content:456:hdoc пункт 1.1
24 acht
 
15.11.20
15:22
*захватили
Хотя так тоже ничего =)
25 RomanYS
 
15.11.20
16:13
(15) соответствие имеет очень узкое назначение (поиск по произвольному ключу) и на этой задаче равных ему по скорости нет. Если им гвозди забивать, то может конечно оно и "жуткий тормоз"
В данной задаче это не требуется, как правильно расписано в (13).
26 ДНН
 
15.11.20
17:43
(23) "1.1. В текстах модулях не допускается использовать букву "ё"." - 1С имеет ввиду слова с буквой ё, чтобы не было путаницы.
А если я переменную в цикле Для обозвал одной буквой ё, то это нормально на мой взгляд. Явно никто не перепутает и не напишет потом е.
27 RomanYS
 
15.11.20
17:46
(26) Если ты одной буквой назвал что-то - уже нарушил все каноны 1С :))
Правильно:
СтрокаТабличнойЧасти
НомерСтрокиТабличнойЧасти
ПростоСчетчикЦикла
...
28 Aleksey
 
15.11.20
17:48
(26) а ещё букву С, ведь тоже постоянно путают русская или английская
29 Ненавижу 1С
 
гуру
15.11.20
17:51
(27) ну не совсем:
4. Имена переменных не должны состоять из одного символа. Использование односимвольных имен переменных допускается только для счетчиков циклов.
30 Asmody
 
15.11.20
19:31
(13) а удаление элемента массива за какое время делается?
31 Ненавижу 1С
 
гуру
15.11.20
19:36
(30) чето я засомневался теперь..
если удаление быстро (если это связанный список, например) но тогда поиск по индексу нет по идеи
если поиск быстрый, то удаление хромает, за счет "сдвига" данных
32 RomanYS
 
15.11.20
19:40
(30) думаешь из соответствия сильно быстрее будет?
33 vde69
 
15.11.20
20:15
я когда онлайн шахматы писал сравнивал скорость поиска по массиву и соответствию, массив на порядок быстрее....
34 RomanYS
 
15.11.20
20:16
(33) Эээ... ты точно по ключу искал?
35 RomanYS
 
15.11.20
20:16
(33) онлайн шахматы на 1С?
36 vde69
 
15.11.20
20:17
(34) да, правда это было на 8.1...
37 vde69
 
15.11.20
20:18
38 ДНН
 
15.11.20
20:28
(36) Они потом сделали из соответствия хэш-таблицу. Раньше как-то по другому было сделано
39 ДНН
 
15.11.20
20:29
https://its.1c.ru/db/v8std#content:452:hdoc в самом конце про поиск в массиве и в соответствии
40 RomanYS
 
15.11.20
20:34
(37) я вероятно как-то по-другому слово "онлайн" понимал :) Они по сети или там движок?
41 acht
 
15.11.20
21:22
(26) >  1С имеет ввиду слова
1C однозначно имеет в виду текст модуля. Который состояит из слов, имен переменных и т.п.
Твой взгляд, он... ценен только для тебя.
42 acht
 
15.11.20
21:25
Наброшу по теме - а что вы все в массив уперлись так? Там в ТЗ ограничения на порядок последовательности вообще нет. Берете структуру данных, эффективную по поиску и вперед =)
43 vde69
 
15.11.20
21:33
(40) по сети
44 RomanYS
 
15.11.20
21:57
(42) Так а где поиск то? Всё что нужно - получение по индексу числовому, массив это на 100% закрывает.
Единственное тонкое место - удаление, но тут тоже большие сомнения, что в какой-то коллекции будет лучше.
45 RomanYS
 
15.11.20
22:01
(43) Понял, я исходно про веб подумал, связка веб+1С8.1 диссонанс вызвала)

(36) Вообще странно, соответствия всегда вроде были быстрыми (при поиске по ключу), даже помню где-то были рекомендации пихать строки ТЗ в соответствие для быстрого поиска. Индексов у ТЗ тогда не было - по идее как раз где-то 8.1 была
46 МихаилМ
 
16.11.20
02:34
непонятен термин "последовательность". скорее всего автор вопросов - тупой адинесник.
47 Lexandr
 
16.11.20
08:02
Если уж прям бороться за скорость может проще найти 10 случайный чисел и выкинуть их из ряда 1..30.
48 Ненавижу 1С
 
гуру
16.11.20
08:27
49 icipher
 
16.11.20
09:47
возможно, вам поможет Линейный конгруэнтный метод
50 RomanYS
 
16.11.20
10:16
(47) Так оставшиеся потом перемешать надо будет. Естественное желание - иметь один алгоритм на все размеры выборки и диапазоны
51 Serg_1960
 
16.11.20
10:35
(50) Зачем? Убывающая или возрастающая последовательность из случайных чисел не противоречит условиям (0)
52 RomanYS
 
16.11.20
10:40
(51) Можно поспорить)
Последовательность случайных чисел конечно может случайно оказаться упорядоченной, но вероятность этого очень мала для последовательности даже в 10 элементов.
53 Said_We
 
16.11.20
10:46
(47) Я в (18) тоже это предлагал. Но народ как-то не отреагировал. Все думали как быстрее, а быстрее задачу от обратного решить.
(50) Так два алгоритма решения задачи или прямой, если диапазон больше в два раза и более чем необходима выборка и обратный, если выборка более половины диапазона.
54 Serg_1960
 
16.11.20
10:49
(52) Согласен, маловероятно. Но чем это будет противоречить задачам, где требуется набор случайных числе?
Имхо, (18) - оригинальное решение. Если в последовательности больше 50% чисел из заданого диапазона, то оно - предпочтительнее. Тем более, если есть условие уникальности. В даном конкретном случае, цикл "исключений" из 30 чисел, пока их не останется 20 чисел - без проверки на уникальность.
55 Mikeware
 
16.11.20
10:49
(52) почему? упорядоченность не противоречит случайному распределению
56 Serg_1960
 
16.11.20
10:58
(54) Sorry, чисел не 30, а 31 - про "0" в исходных условиях забыл.
57 RomanYS
 
16.11.20
11:04
(55) хз, что ожидали авторы задачи. Но если исходить из общих принципов, то имхо заведомо упорядоченная последовательность не удовлетворяет "последовательность случайных чисел". Но так как мы не оперируем жёсткой терминологией, то спор бессмыслен: понимай как хочешь.

(54) "набор случайных чисел" и последовательность - разные термины. Если набор сам по себе не имеет внутреннего порядка, то для него порядок вывод не важен и можно выдать упорядоченный. А последовательность заведомо имеет внутренний порядок. Но это опять вопрос скорее терминологии, которая здесь не установлена. Поэтому понимай как хочешь.

(53) Два алгоритма для такой задачи - это кажется называется избыточной оптимизацией :))
58 Said_We
 
16.11.20
12:17
ШУТКА!!!

with
VT_DVA (a) as (SELECT 0 as a union all SELECT 1)
,VT_Dec (a) as (SELECT top 11 t.a as a
        from
            (SELECT
                t1.a*8 + t2.a*4 + t3.a*2 + t4.a as a
            from
                 VT_DVA as t1
                ,VT_DVA as t2
                ,VT_DVA as t3
                ,VT_DVA as t4) as t
        group by
            t.a
        order by
            t.a
        )
,VT_tic (a) as (SELECT top 1001 t.a as a
        from
            (SELECT
                t3.a*100 + t2.a*10 + t1.a as a
            from
                VT_Dec as t1
                ,VT_Dec as t2
                ,VT_Dec as t3
            ) as t
        group by
            t.a
        order by
            t.a
        )

SELECT top 20
    t.nn as nn
from
(SELECT
       Min(t.a) as a
    ,t.nn as nn
from
    (SELECT
           t.a as a
         ,CAST(RAND(CHECKSUM(NEWID())) * 31 as INT) as nn
    from
        VT_tic as t
    ) as t
group by
    t.nn) as t

order by
    a
59 Said_We
 
16.11.20
12:20
Здесь строка "CAST(RAND(CHECKSUM(NEWID())) * 31 as INT) as nn" и есть генерация случайного числа от 0 до 30 включительно.
В каждой шутке есть доля шутки.
60 Said_We
 
16.11.20
12:25
VT_tic - это тысяча строк. Что бы точно хватило.
Минусы у алгоритма есть. Проще найти не 20, а 10 и исключить их из последовательности. Так быстрее и 1000 точно хватит. Т.е. данный алгоритм был бы оптимальный если бы необходимо было бы найти менее половины из 30 возможных, т.е. от одного числа до 15. Если больше, то ищем меньше и вычитаем их из 30.
61 Said_We
 
16.11.20
12:32
"Если больше, то ищем меньше и вычитаем их из 30." - Если необходимо большее количество элементов чем половина всей последовательности, то ищем количество цифр равное разности общего количества и необходимого. Находим эти элементы. Исключаем эти элементы из общей последовательности.
62 Said_We
 
16.11.20
12:38
(57) "Два алгоритма для такой задачи - это кажется называется избыточной оптимизацией" - нет.
Например, для разных последовательности методы сортировки могут давать разный результат по скорости. т.е. на одной последовательности КвикСорт быстрее, а на другой совсем не он. И наоборот. Часто применяют симбиоз. До какого-то этапа применяют один метод сортировки, а начиная с каких-то этапов итераций другой. По крайней мере в умных книжках старых такие примеры приводили. Суть получить меньшее количество перестановок.
63 RomanYS
 
16.11.20
12:43
(62) Не всякая оптимизация избыточная - это понятно. Но это не значит в данном случае нужно заморачиваться, здесь подобный подход неоправдан и (11) вполне годно и оптимально решает задачу в общем случае.
64 Said_We
 
16.11.20
13:52
Шутка не удалась, по всей видимости.
В (0) не было условия, что данная задача только на языке 1С необходимо решать. Вот и пошутил.... :-)
Ещё, наверняка, будет интересно выглядеть код на прологе :-)
65 Said_We
 
16.11.20
15:42
Хотя.....
Что нам мешается подключиться к SQL и выполнить текст запроса? Входных параметров нет - все параметры в тексте запроса.
SQL в этом смысле универсальный язык. По сути пишешь, что в результате необходимо получить, а не зацикливаешься на том как результат необходимо получить и какие объекты/классы при этом оптимально использовать. Работаешь с информацией напрямую.