Имя: Пароль:
1C
1С v8
v8: Генератор чисел повторяет одно и то же число
,
0 Sem0709
 
19.12.13
16:26
8.1.14.72

Процедура КнопкаВыполнитьНажатие(Кнопка)    
    Сообщить(ГенераторСлучайныхЧиселЗнач1());
    Сообщить(ГенераторСлучайныхЧиселЗнач2());
    Сообщить(ГенераторСлучайныхЧиселЗнач3());    
КонецПроцедуры
Функция ГенераторСлучайныхЧиселЗнач1()    
    ГенераторЧисел = Новый ГенераторСлучайныхЧисел();
    СлучайноеЧисло1 = ГенераторЧисел.СлучайноеЧисло(5, 49);
    Возврат СлучайноеЧисло1;
КонецФункции
Функция ГенераторСлучайныхЧиселЗнач2()    
    ГенераторЧисел = Новый ГенераторСлучайныхЧисел();
    СлучайноеЧисло2 = ГенераторЧисел.СлучайноеЧисло(5, 49);
    Возврат СлучайноеЧисло2;
КонецФункции
Функция ГенераторСлучайныхЧиселЗнач3()    
    ГенераторЧисел = Новый ГенераторСлучайныхЧисел();
    СлучайноеЧисло3 = ГенераторЧисел.СлучайноеЧисло(5, 49);
    Возврат СлучайноеЧисло3;
КонецФункции

В общем суть в том, что при нажатии кнопки практически всегда выдает одно и тоже число. Это можно побороть ?
1 Fragster
 
гуру
19.12.13
16:27
Перем ГСЧ;

а дальше в функциях

Если ГСЧ <> Неопределено Тогда
  ГСЧ = Новый Генератор...
КонецеСЛИ
2 mickey1cx
 
19.12.13
16:35
СП говорит: Генератор случайных чисел инициализируется начальным числом из параметра.
Последовательность случайных чисел для одного и того же начального числа будет одинакова.

Делай хотя бы так

Функция ГенераторСлучайныхЧиселЗнач(НачальноеЧисло)    
    ГенераторЧисел = Новый ГенераторСлучайныхЧисел(НачальноеЧисло);
    СлучайноеЧисло3 = ГенераторЧисел.СлучайноеЧисло(5, 49);
    Возврат СлучайноеЧисло3;
КонецФункции

Сообщить(ГенераторСлучайныхЧиселЗнач(1));
Сообщить(ГенераторСлучайныхЧиселЗнач(2));
Сообщить(ГенераторСлучайныхЧиселЗнач(3));
3 Hmster
 
19.12.13
16:42
Получать новый уникальный идентификатор, преобразовывать в число, генерировать с начальным числом как в (2)
4 andrewalexk
 
19.12.13
16:43
(0) :) ..часом не 42?
5 banco
 
19.12.13
16:48
(3) или ТекущаяУниверсальнаяДатаВМиллисекундах(), но точно не помню в 8.1 была ли эта функция
6 Wobland
 
19.12.13
16:52
(0) дарю

Процедура КнопкаВыполнитьНажатие(Кнопка)    
    Сообщить(8);
    Сообщить(3);
    Сообщить(4);    
КонецПроцедуры
7 Sem0709
 
19.12.13
17:17
(1) Тоже самое... и надо в первый раз присваивать переменной значение, т.к. по умолчанию она Неопределено

(2) Тогда числа всегда одинаковые

(4) Не понял !?

(5) Не было.

(6) Спасибо, зачем ? Мне вроде случайные нужны.


(3) Курю как преобразовывать в число...
8 Fragster
 
гуру
19.12.13
17:19
(7) надо ГСЧ сделать глобальной
9 Wobland
 
19.12.13
17:23
(7) они случайные. бросал кубик
10 Sem0709
 
19.12.13
17:24
(8) Не правильно понял твой пример сначало, но в любом случаи тоже что и у меня: числа повторяются на один клик.

34
34
34

35
35
35

40
40
40
11 Wobland
 
19.12.13
17:25
(10) не верю
12 Sem0709
 
19.12.13
17:26
(9) Не, не нужно, оставь, может самому сгодятся.
13 Sem0709
 
19.12.13
17:26
(11) Во что ? :)
14 Fragster
 
гуру
19.12.13
17:26
(10) не вижу кода
15 Sem0709
 
19.12.13
17:27
(11) так и есть, я прям сейчас пробую... может уже на более свежих версиях и по другому, но у меня так...
16 Wobland
 
19.12.13
17:28
(13) в твою искренность
Процедура КнопкаВыполнитьНажатие(Кнопка)    
КонецПроцедуры
Функция ГенераторСлучайныхЧиселЗнач1()    
    ГенераторЧисел = Новый ГенераторСлучайныхЧисел();
    СлучайноеЧисло1 = ГенераторЧисел.СлучайноеЧисло(5, 49);
    Возврат СлучайноеЧисло1;
КонецФункции
Функция ГенераторСлучайныхЧиселЗнач2()    
    ГенераторЧисел = Новый ГенераторСлучайныхЧисел();
    СлучайноеЧисло2 = ГенераторЧисел.СлучайноеЧисло(5, 49);
    Возврат СлучайноеЧисло2;
КонецФункции
Функция ГенераторСлучайныхЧиселЗнач3()    
    ГенераторЧисел = Новый ГенераторСлучайныхЧисел();
    СлучайноеЧисло3 = ГенераторЧисел.СлучайноеЧисло(5, 49);
    Возврат СлучайноеЧисло3;
КонецФункции

    Сообщить(ГенераторСлучайныхЧиселЗнач1());
    Сообщить(ГенераторСлучайныхЧиселЗнач2());
    Сообщить(ГенераторСлучайныхЧиселЗнач3());

26
35
7
17 Fragster
 
гуру
19.12.13
17:28
Перем ГенераторЧисел

Процедура КнопкаВыполнитьНажатие(Кнопка)    
    Если ГенераторЧисел = Неопределено Тогда
        ГенераторЧисел = Новый ГенераторСлучайныхЧисел();
    КонецЕсли;
    Сообщить(ГенераторСлучайныхЧиселЗнач1(ГенераторЧисел ));
    Сообщить(ГенераторСлучайныхЧиселЗнач2(ГенераторЧисел ));
    Сообщить(ГенераторСлучайныхЧиселЗнач3(ГенераторЧисел ));    
КонецПроцедуры
Функция ГенераторСлучайныхЧиселЗнач1(ГенераторЧисел )    
    СлучайноеЧисло1 = ГенераторЧисел.СлучайноеЧисло(5, 49);
    Возврат СлучайноеЧисло1;
КонецФункции
Функция ГенераторСлучайныхЧиселЗнач2(ГенераторЧисел )    
    СлучайноеЧисло2 = ГенераторЧисел.СлучайноеЧисло(5, 49);
    Возврат СлучайноеЧисло2;
КонецФункции
Функция ГенераторСлучайныхЧиселЗнач3(ГенераторЧисел )    
    СлучайноеЧисло3 = ГенераторЧисел.СлучайноеЧисло(5, 49);
    Возврат СлучайноеЧисло3;
КонецФункции
18 Sem0709
 
19.12.13
17:34
(16) Ну вот попробуй сам... НЕ работает!


(17) Спасибо огромное. заработало!!
После объявление глобальной переменной ";", если кто использовать будет.
19 Wobland
 
19.12.13
17:34
(18) а ты думал, откуда я это скопипастил?
20 Dirk Diggler
 
19.12.13
17:59
омг.... я думал, даже детей учат инициализировать ГСЧ текущим временем...
21 Fragster
 
гуру
19.12.13
18:03
(20) ну инициализируй код в (0) текущим временем...
22 Dirk Diggler
 
19.12.13
18:09
(21) В подавляющем большинстве случаев подойдет:

Функция ГенераторСлучайныхЧиселЗнач1()    
    ГенераторЧисел = Новый ГенераторСлучайныхЧисел(Секунда(ТекущаяДата())+ Минута(ТекущаяДата()) );
    СлучайноеЧисло1 = ГенераторЧисел.СлучайноеЧисло(5, 49);
    Возврат СлучайноеЧисло1;
КонецФункции
23 Dirk Diggler
 
19.12.13
18:10
а лучше так:
Функция ГенераторСлучайныхЧиселЗнач1()    
    ГенераторЧисел = Новый ГенераторСлучайныхЧисел(Секунда(ТекущаяДата())+ Минута(ТекущаяДата())*60 );
    СлучайноеЧисло1 = ГенераторЧисел.СлучайноеЧисло(5, 49);
    Возврат СлучайноеЧисло1;
КонецФункции
24 Sem0709
 
19.12.13
18:12
(23) Для одного подойет, а для трех в один в один момент будет три одинаковых числа.
25 Dirk Diggler
 
19.12.13
18:13
(24) Дык ГСЧ должен быть. Или мешает что?
26 Dirk Diggler
 
19.12.13
18:13
*глобальный
27 Sem0709
 
19.12.13
18:17
(26) Проблема что при выполнении события из (0) три одинковых числа получались...
28 Sem0709
 
19.12.13
18:37
Можно не использовать глобальную переменую:

Процедура КнопкаВыполнитьНажатие(Кнопка)
    ГенераторЧисел = Новый ГенераторСлучайныхЧисел();
    Сообщить(ГенераторСлучайныхЧиселЗнач1(ГенераторЧисел));
    Сообщить(ГенераторСлучайныхЧиселЗнач2(ГенераторЧисел));
    Сообщить(ГенераторСлучайныхЧиселЗнач3(ГенераторЧисел));
КонецПроцедуры
Функция ГенераторСлучайныхЧиселЗнач1(ГенераторЧисел)
    СлучайноеЧисло = ГенераторЧисел.СлучайноеЧисло(5, 49);
    Возврат СлучайноеЧисло;
КонецФункции
Функция ГенераторСлучайныхЧиселЗнач2(ГенераторЧисел)
    СлучайноеЧисло = ГенераторЧисел.СлучайноеЧисло(5, 49);
    Возврат СлучайноеЧисло;
КонецФункции
Функция ГенераторСлучайныхЧиселЗнач3(ГенераторЧисел)        
    СлучайноеЧисло = ГенераторЧисел.СлучайноеЧисло(5, 49);
    Возврат СлучайноеЧисло;    
КонецФункции

Без функций:

Процедура КнопкаВыполнитьНажатие(Кнопка)
    
    ГенераторЧисел = Новый ГенераторСлучайныхЧисел();
    Сообщить(ГенераторЧисел.СлучайноеЧисло(5, 49));
    Сообщить(ГенераторЧисел.СлучайноеЧисло(5, 49));
    Сообщить(ГенераторЧисел.СлучайноеЧисло(5, 49));
    
КонецПроцедуры


Как я понял, в (0) я в каждой функции создавал новый генератор, поэтому отображалось три одинаковых числа.