![]() |
![]() |
|
Код работает правильно ТОЛЬКО при отладке | ☑ | ||
---|---|---|---|---|
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] Мистика, но теперь хотя бы понятная. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |