Имя: Пароль:
1C
1С v8
Код работает правильно ТОЛЬКО при отладке
0 Sir Nickname
 
29.08.18
10:10
Доброго времени суток.

Проблема очень, очень, очень, очень странная.

Дано:
1) Общий модуль раз (только флаг "Сервер") с процедурой, генерирующей массив случайных чисел.

Код предельно прост и имеет примерно следующий вид:
[CODE]Функция МассивСЧ(Количество, Предел) Экспорт

    ГСЧ = Новый ГенераторСлучайныхЧисел;
    Результат = Новый Массив;

    Для Нум = 1 по Количество Цикл
        Результат.Добавить(ГСЧ.СлучайноеЧисло(1, Предел));
    КонецЦикла;

    Возврат Результат;

КонецФункции
[/CODE]


2) Общий модуль два (флаги "Сервер" и "Вызов сервера"), через который вызывается с клиента предыдущий модуль.

Имеем ситуацию:

Этот код всегда возвращает массив одинаковых чисел.
Но! Если тот же самый код проходить в режиме отладки, то всё работает правильно.

У кого-нибудь есть идеи, почему такое может быть?
1 Cool_Profi
 
29.08.18
10:12
Новуб соль задать при инициализации ГСЧ?
2 Cyberhawk
 
29.08.18
10:12
"Этот код всегда возвращает массив одинаковых чисел" // Код-то показывай
3 DrWatson
 
29.08.18
10:21
"Генератор случайных чисел инициализируется временем работы операционной системы с момента старта."

Вероятно, вызовы выполняются настолько быстро, что генератор инициализируется одинаково, в следствии чего и выдаёт одинаковый результат.
В отладке же пока вы пройдёте несколько шагов пройдёт сколько-то секунд и следующий вызов будет инициализирован уже другим числом.
4 DrWatson
 
29.08.18
10:25
+(3) Конструктор может быть и с параметром. См. справку
5 strrike
 
29.08.18
10:28
платформа может.
6 Михаил Козлов
 
29.08.18
10:35
(4)+ Использовал конструктор ГСЧ с параметром.
7 Sir Nickname
 
29.08.18
10:43
[UPD] Упустил важную деталь.
В силу некоторых причин, ГСЧ инициализируется в другой процедуре, которая вызывается с заданными параметрами на каждой итерации цикла, в котором СЧ пишутся в массив.

[CODE]Функция СгенеритьСЧ(Предел) Экспорт
    ГСЧ = Новый ГенераторСлучайныхЧисел;
    Возврат ГСЧ.СлучайноеЧисло(1, Предел)
КонецФункции

Функция МассивСЧ(Количество, Предел) Экспорт

    ГСЧ = Новый ГенераторСлучайныхЧисел;
    Результат = Новый Массив;

    Для Нум = 1 по Количество Цикл
        Результат.Добавить(СгенеритьСЧ(Предел));
    КонецЦикла;

    Возврат Результат;

КонецФункции[/CODE]

Дорогой (2), выкладывать точно тот же код, что и у меня, смысла нет, так как:
- там полно заморочек, которые не имеют никакого отношения к делу и будут только отвлекать от настоящей проблемы
- которая в коде, приведённом выше, проявляется точно тем же образом (сейчас специально проверил)

Уважаемый (3) - полагаю, что Вы правы, поскольку я только что обнаружил, что если инициализировать ГСЧ перед циклом, и в той же функции генерить СЧ на каждой итерации этого цикла, то всё работает хорошо. А если вынести ГСЧ в отдельную функцию, где он будет инициализироваться и выдавать СЧ на каждой итерации, то почему-то все СЧ в полученном массиве будут совпадать. И да - похоже, что это привязано к времени инициализации ГСЧ.
8 Sir Nickname
 
29.08.18
10:47
Другими словами:

Вот это выдаёт массив разных чисел

[CODE]Функция МассивСЧ(Количество, Предел) Экспорт

    ГСЧ = Новый ГенераторСлучайныхЧисел;
    Результат = Новый Массив;

    Для Нум = 1 по Количество Цикл
        Результат.Добавить(ГСЧ.СлучайноеЧисло(1, Предел));
    КонецЦикла;

    Возврат Результат;

КонецФункции[/CODE]

А если делать так, то даже при использовании ГСЧ все числа в массиве будут одинаковыми:

[CODE]Функция СгенеритьСЧ(Предел) Экспорт
    ГСЧ = Новый ГенераторСлучайныхЧисел;
    Возврат ГСЧ.СлучайноеЧисло(1, Предел)
КонецФункции

Функция МассивСЧ(Количество, Предел) Экспорт

    ГСЧ = Новый ГенераторСлучайныхЧисел;
    Результат = Новый Массив;

    Для Нум = 1 по Количество Цикл
        Результат.Добавить(СгенеритьСЧ(Предел));
    КонецЦикла;

    Возврат Результат;

КонецФункции[/CODE]

Мистика, но теперь хотя бы понятная.