Имя: Пароль:
1C
1С v8
Получить случайные числа в ГенераторСлучайныхЧисел
,
0 John83
 
02.03.16
17:14
В таком цикле случ. числа будут очень часто повторяться. Как можно этого избежать?
PS гл. переменную использовать нельзя, т.к. сервер

Пока Истина Цикл
    ОбработкаПрерыванияПользователя();
    случ = ПолучитьСлучайноеЧислоДляШтрихкода();
    Если Массив.Найти(случ) <> Неопределено Тогда
        сообщить(сч + " - " + случ);
    КонецЕсли;        
    Массив.Добавить(случ);
КонецЦикла;
1 John83
 
02.03.16
17:15
Функция ПолучитьСлучайноеЧислоДляШтрихкода() Экспорт
    ШК = 0;
    глГенераторСлучайныхЧисел1 = Новый ГенераторСлучайныхЧисел;
    Пока ШК = 0 Цикл
        ШК = глГенераторСлучайныхЧисел1.СлучайноеЧисло(глГенераторСлучайныхЧисел1.СлучайноеЧисло(10000),);
        ШК = ШК % 1000000000;
    КонецЦикла;
    Возврат ШК;
КонецФункции
2 itlikbez
 
02.03.16
17:25
(0) Хоть и "нельзя", а придется. Инициализируй генератор за пределами цикла и передавай его как параметр в функцию.
3 Жан Пердежон
 
02.03.16
17:27
Формирование неинициализированного объекта
Синтаксис:

Новый ГенераторСлучайныхЧисел()
Описание:

Генератор случайных чисел инициализируется временем работы операционной системы с момента старта.
4 itlikbez
 
02.03.16
17:33
(1) А, кстати, зачем такие сложности

глГенераторСлучайныхЧисел1.СлучайноеЧисло(глГенераторСлучайныхЧисел1.СлучайноеЧисло(10000),);

а потом остаток от деления на миллион?

напиши просто

глГенераторСлучайныхЧисел1.СлучайноеЧисло(1,1000000);

и цикл не нужен будет.
5 John83
 
02.03.16
17:33
(4) так тоже пробовал
6 John83
 
02.03.16
17:34
(2) цикл в первой процедуре только для наглядности
7 itlikbez
 
02.03.16
17:34
+(4) Да и функция тогда не нужна.
8 John83
 
02.03.16
17:34
(7) к функции идет обращение из других мест
9 John83
 
02.03.16
17:35
в общем вот такой г-код

Функция ПолучитьСлучайноеЧислоДляШтрихкода() Экспорт
    ШК = 0;
    глГенераторСлучайныхЧисел1 = Новый ГенераторСлучайныхЧисел;
    МассивЧисел = Новый Массив;
    
    Для сч = 1 По 10000 Цикл
        ШК = глГенераторСлучайныхЧисел1.СлучайноеЧисло();
        ШК = ШК % 1000000000;        
        МассивЧисел.Добавить(ШК);        
    КонецЦикла;
    
    Пока Истина Цикл
        ШК = глГенераторСлучайныхЧисел1.СлучайноеЧисло();
        ШК = ШК % 1000000000;
        Если ШК = 0 Тогда
            Продолжить;
        КонецЕсли;
        Если МассивЧисел.Найти(ШК) = Неопределено Тогда
            Возврат ШК;
        КонецЕсли;
    КонецЦикла;
    
КонецФункции
10 itlikbez
 
02.03.16
17:35
гсч=новый ГенераторСлучайныхЧисел();
Пока Истина Цикл
    ОбработкаПрерыванияПользователя();
    случ = гсч.СлучайноеЧисло(1,1000000);
    Если Массив.Найти(случ) <> Неопределено Тогда
        сообщить(сч + " - " + случ);
    КонецЕсли;        
    Массив.Добавить(случ);
КонецЦикла;
11 John83
 
02.03.16
17:37
(10) еще раз говорю - цикл для наглядности
12 Tateossian
 
02.03.16
17:37
(0) Вот тебе ГСЧ на основе УИД

Функция ПолучитьСлучайноеЧисло(Мин,Макс)

    //вместо Randomize
    Для н = 1 По 100 Цикл
    Уник = Новый УникальныйИдентификатор;
    КонецЦикла;

    //генерируем GUID
    Уник = СокрЛП(Новый УникальныйИдентификатор);

    //оставляем только цифры
    Уник = СтрЗаменить(Уник,"-","");
    Уник = СтрЗаменить(Уник,"a","");
    Уник = СтрЗаменить(Уник,"b","");
    Уник = СтрЗаменить(Уник,"c","");
    Уник = СтрЗаменить(Уник,"d","");
    Уник = СтрЗаменить(Уник,"e","");
    Уник = СтрЗаменить(Уник,"f","");

    //знаменатель должен иметь такое же количество нулей + 1
    Знаменатель = 10;
    Для н = 2 По (СтрДлина(СтрЗаменить(Уник,Символы.НПП,""))) Цикл
    Знаменатель = Знаменатель * 10;
    КонецЦикла;

    Случ = Число(Уник) / Знаменатель; //здесь получается дробное случайное число от 0 до 1

    //преобразуем его в случайное число из заданного интервала, округляем до целого
    ЧислоИзИнтервала = Мин(Макс(Окр(Мин + (Макс-Мин)*Случ),Мин),Макс);

    Возврат ЧислоИзИнтервала;

КонецФункции
13 itlikbez
 
02.03.16
17:40
(11) Передавай гсч параметром в функцию.
14 John83
 
02.03.16
17:54
(12) эк как закрутил-то..
15 Tateossian
 
02.03.16
18:07
(14) Зато работает:)
16 Garykom
 
гуру
02.03.16
18:50
А слабо генератор от текущей даты с секундами каждый раз?
17 John83
 
02.03.16
18:57
(15) пока заюзал свой вариант, но будущее учту ;)
18 John83
 
02.03.16
18:57
(16) а что если несколько вызовов в одну секунду?
19 John83
 
02.03.16
18:57
(13) в лом переписывать все места вызова
20 Garykom
 
гуру
02.03.16
19:10
А зачем требуется случайное число для ШК?
Есть же ГУИД?
21 opus70
 
02.03.16
19:12
(9) на 100% согласен что предложный вариант один из лучших
проверено не один раз
имел печальку сталкиваться с псевдослучайностью на основе 1С генератора в частности в ВДГБ учет в жкх ...
пока не заменил не заработало
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.