|
Получить случайные числа в ГенераторСлучайныхЧисел | ☑ | ||
---|---|---|---|---|
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С генератора в частности в ВДГБ учет в жкх ... пока не заменил не заработало |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |