Имя: Пароль:
1C
 
Функция Random в 1С
0 1c_Sensey
 
10.08.07
10:09
Подскажите пожалуйста функцию генерации случайного числа/символа в 1С
1 Эльниньо
 
10.08.07
10:10
//_____________________________________________________________________________
function random(n) export
   randSeed = _getPerformanceCounter() * 1103515245 + 12345;
   return ((randSeed / 65536) % 32768) % n+1;
endFunction
2 IUnknown
 
10.08.07
10:10
3 1c_Sensey
 
10.08.07
10:11
Это что за язык?
4 IamAlexy
 
10.08.07
10:11
ты будешь удивлен: 1с :)
5 Woron
 
10.08.07
10:13
Аутор . Этот вопрос много раз задавали. А мне всегда было интересно Зачем рандом в 1С?
6 Эльниньо
 
10.08.07
10:14
(3) Извините:

//_____________________________________________________________________________

Функция РандомХренов(н) Эспорт
   РандСид = _getPerformanceCounter() * 1103515245 + 12345;
   Возврат ((РандСид / 65536) % 32768) % н+1;
КонецФункции;
7 1c_Sensey
 
10.08.07
10:14
(4) Действительно удивлен :) Щас попробую
8 NS
 
10.08.07
10:16
(1,6) Кто ж с Таймера случайное число считает???
_GetPerformanceCounter()
Нормально использовать только для Randomize() -
начальной установки RandSeed
9 IamAlexy
 
10.08.07
10:18
(5) например по методу монтекарло считать число PI с заданой точностью :)
ну или например оклад рассчитывать...
" а назначем мы сотрудникам седня зарплату пофиг как в диапазоне от 1000 до 2000 у.е"
10 IamAlexy
 
10.08.07
10:19
(0)(1)(6) может лучше через ком обращатся к функциям VBS и  использовать RND() ?
11 NS
 
10.08.07
10:21
Решение:
1. т.к. генератор от avb и NS давал маленький разброс случайных чисел, пришлось поюзать немного другой алгоритм:


function Random()
   if emptyvalue(randSeed) = 1 then
       randSeed = _getperformancecounter();
   endif;                      
   
   randSeed=(a*randSeed+c)%m;
   return randSeed;
endfunction



Здесь:
a=1664525; c=1013904223; m=4294967296;
последняя переменная - 2 в 32-й степени, две другие - рекомендуемые для таких целей коэффициенты

Приводить к интервалу [0..A-1] лучше вот так -

цел(Randseed * A / m) - это лучше чем (RandSeed / A)
12 NS
 
10.08.07
10:22
(10) А Зачем?
13 NS
 
10.08.07
10:23
Ну все поняли - в более плохом вариенте есно не "/", а "%"
14 IamAlexy
 
10.08.07
10:23
(12) похоже на настоящий RANDOM
15 Woron
 
10.08.07
10:25
(9) В точно такомже вопросе утор писал что ему НУЖНО выбирать случайные элементы из справочника . Но к сожалению тот аутор кудато потерялся.  

АУТОР если ты тут скажи ЗАЧЕМ???
16 NS
 
10.08.07
10:25
(14) Ты настоящий рандом видел? :lol:
Погугли Random() в Делфи, Вариант (11) лучше делфевого Рандома.
17 IamAlexy
 
10.08.07
10:28
(16) к сожалению окинув взглядом 2 выдаваемые последовательности чисел, оценить наскольо одна из них более настоящий RANDOM чем другая не имею навыков и знаний.
18 1c_Sensey
 
10.08.07
10:30
Пароли генерирую случайные
19 IUnknown
 
10.08.07
10:31
(16)вот здесь не могу с вами согласиться...
20 IUnknown
 
10.08.07
10:32
тьфу (19) читать как "вот здесь не могу с вами не согласиться"
21 NS
 
10.08.07
10:32
(17) Ты посмотри ВИД Делвевого РАНДОМА.
Там Рандом -
   randSeed=(a*randSeed+c)%m;
   return randSeed;

m так-же равно 4294967296;
a a=1 для скорости.

И чем Рандом в (11) отличается от Делфевого?
Только тем что Делфевый чуть хуже для большей скорости.

В интервал Делфи укладывает Ровно так-же как рекомедую я -
((RandSeed*A) shr 32 )
22 NS
 
10.08.07
10:33
(19) Гугли, и выкладывай Рандом из Делфи, или хочешь я его выложу?
23 IUnknown
 
10.08.07
10:34
(17)указанный в (11) алгоритм предложен комитетом ANSI-C
24 IamAlexy
 
10.08.07
10:35
function sin(value,sc=0)
     sc=createObject("MSScriptControl.ScriptControl");
     sc.language="VBscript";
     return sc.eval("RND()");
endFunction
25 IamAlexy
 
10.08.07
10:39
sin(value,sc=0) - переменные нафиг не нужны.. остались от функции возвращающей синус... :)
26 NS
 
10.08.07
10:42
Вот стандартный Сишный Рандом:
http://www.vbnet.ru/forum/show.aspx?id=78900&page=3
Делфевый куда-то ссылку запсил... Но короче он такой как я привел выше, только чему равно "с" не помню.

Когда нужен более менее хороший  - всегда стандартные генераторы переписывают - примеры Зобрист (Шахматные программы), Покер (игровые боты)
27 NS
 
10.08.07
10:43
(24,25) Ты не ответил на вопрос - чем этот генератор лучше предложенного в (11)
28 NS
 
10.08.07
10:45
Извиняюсь - Сишный чуть дальше -
http://www.vbnet.ru/forum/show.aspx?id=78900&page=4
29 IamAlexy
 
10.08.07
10:50
(27) яж ответил.. мой мозг не в состоянии оценить 2 последовательности числе на предмет их рандомности и сказать что одна последовательность более рандомная чем другая.
просто мне способ через вбс кажется проще :)
да и особого доверия к вычислениям типа ((а+б/с*д)=случайное_число) для получения "случайного" числа нет...
обосновать не могу но доверия нет :)
30 IamAlexy
 
10.08.07
10:50
(29) хотя я могу искренне заблуждаться :)
31 NS
 
10.08.07
10:55
(29,30) Не понимаю подхода. И в предложенном генераторе, и в делфевом коэффициенты предложены изначально Кнутом.
В Дефлфи были выбраны чуть худшие значения в угоду скорости.
Если не умеешь оценивать - зачем тогда что-то утверждать?
Оценка разных значений для конгруэнтных генераторов есть у Кнута.
32 NS
 
10.08.07
10:56
(29) Ты читать умеешь? Такой генератор и в Си, и в Делфи.
33 NS
 
10.08.07
10:59
И кто тебе сказал что в VBскрипте не конгруэнтный генератор? Вообще-то они практически везде конгруэнтные, так как считаются одними из лучших, и при этом самые быстрые.
34 NS
 
10.08.07
11:05
Вот генератор Делфи:
RandSeed:=(RandSeed*08088405H+1) mod (2^32)  

Вот ассемблерный текст:
function RandInt(Range:Integer):Integer;register;
asm
{    ->EAX    Range  }
{    <-EAX    Result  }
       PUSH    EBX
       XOR    EBX, EBX
       IMUL    EDX,[EBX].RandSeed,08088405H
       INC    EDX
       MOV    [EBX].RandSeed,EDX
       MUL    EDX
       MOV    EAX,EDX
       POP    EBX
end;

function RandExt:Extended;
const
 two2neg32:double=((1.0/$10000)/$10000);// 2^-32
asm
       PUSH    EBX
       XOR    EBX, EBX
       IMUL    EDX,[EBX].RandSeed,08088405H
       INC    EDX
       MOV    [EBX].RandSeed,EDX
       FLD    [EBX].two2neg32
       PUSH    0
       PUSH    EDX
       FILD    qword ptr [ESP]
       ADD    ESP,8
       FMULP  ST(1), ST(0)
       POP    EBX
end;
35 IamAlexy
 
10.08.07
11:27
(31)(32)(33)(34) в посте (10) обрати внимание на слово "может"
я не утверждаю что лучше
я просто спрашиваю...

просто как один из вариантов.
36 NS
 
10.08.07
11:44
(35) Я читаю твой (14) пост.
И обясняю тебе - Рандом из (11) Это и есть настоящий рандом, и так-же как и все остальные стандартные генераторы в распространенных языках он использует линейный конгруэнтный метод и берет начальное значение с таймера. Точно так-же как и в Делфи, и в Си, и в Вбскрипте.
Ты же не используешь арифмитические опреции через VBS?
А то вдруг они в 1С ненастоящие, а там что ни на есть самые настоящие :)
37 Torquader
 
10.08.07
20:27
Чего-то мне кажется, что использование random для паролей - не очень хороший метод - перебрать могут быстро.
38 NS
 
11.08.07
00:13
(37) Твой моск схавал Ктулкху?
39 IamAlexy
 
11.08.07
00:43
(37) видимо он хочет быстро подобрать рандомом пароль вида:

"3bRQW4npa5gMd7MBRAW0"

хотя мысль здравая, нада в обработки по управлению списком пользователей базы добавить генерилку паролей... а то самому надоедает придумывать пароли вида
123
321
итд...
40 mamont
 
11.08.07
00:45
Извиняюсь за шутку, но имхо, лучший рандом, это подбор чего угодно руками оператора... Удачных выходных! :)))))
41 IamAlexy
 
11.08.07
00:48
(40) тото большинство паролей состоят из комбинаций
123
321
987
789
:)
а все он, оператор наподбирал....
42 mamont
 
11.08.07
00:50
(41) Это та самая непредсказуемая предсказуемость... Могут, когда не знают что делают, веть да? :))))
43 Злобный Фей
 
11.08.07
07:10
Алгоритмы... Пилять, озвучил юзеру требования к паролю и все дела. Нехай креативит. Нахрен рандомайзить? Напрер обязательное требование не менее 8 символов с использованием строчных, прописных и цифрей. Все равно ведь защита в 1с чисто условная, к сожалению.
44 Злобный Фей
 
11.08.07
07:15
Обычно проблема не в рандоме, не в пароле. Та и васче, хто нахрен будет подбирать пароли? Проблема обычно в отучении вешания стикера с паролем на монитор. Бо генери/не генери што хош, а коли стикер на монике висит, то на кой хрен все эти телодвижения - не понятно
45 IamAlexy
 
11.08.07
09:27
(43)(44) пароли пользователей делаются не для того чтобы злобный "}{AsKeр" не проник в базу а для того чтбы для документов с "высоким уровнем ответсвенности" можно было гарантировать невмешательство в документ третьих лиц.
тоесть тобы тетя машаа-бухгалтер не заявляла - "а я ничего не знаю про эту дебиторскую задолженность а то что в документах значится мой пользователь ничего не значит ибо  у меня пароль 123 и все его знаю и вообще ничего я не знаю"

имхо.

+ чем строже пароль тем ответственнее пользователь в целом к системе подходит ...(наблюдения личные)
46 Злобный Фей
 
11.08.07
10:06
(45) Полностью согласен. Ты уточнил то, что как раз подразумевалось в указанных постах