На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> randomize();
    Привет Люди :).Не подскажите что представляет из себя функция randomize() и random()
    то биш по какому алгоритму генерируются случайные числа??
      Функция Randomize просто устанавливает начальное значение для веременной RandSeed. Вот как она описана в Делфи 6:
      ExpandedWrap disabled
        procedure       Randomize;
        {$IFDEF LINUX}
        begin
          RandSeed := _time(nil);
        {$ENDIF}
        {$IFDEF MSWINDOWS}
        var
                systemTime :
                record
                        wYear   : Word;
                        wMonth  : Word;
                        wDayOfWeek      : Word;
                        wDay    : Word;
                        wHour   : Word;
                        wMinute : Word;
                        wSecond : Word;
                        wMilliSeconds: Word;
                        reserved        : array [0..7] of char;
                end;
        asm
                LEA     EAX,systemTime
                PUSH    EAX
                CALL    GetSystemTime
                MOVZX   EAX,systemTime.wHour
                IMUL    EAX,60
                ADD     AX,systemTime.wMinute   { sum = hours * 60 + minutes    }
                IMUL    EAX,60
                XOR     EDX,EDX
                MOV     DX,systemTime.wSecond
                ADD     EAX,EDX                 { sum = sum * 60 + seconds              }
                IMUL    EAX,1000
                MOV     DX,systemTime.wMilliSeconds
                ADD     EAX,EDX                 { sum = sum * 1000 + milliseconds       }
                MOV     RandSeed,EAX
        {$ENDIF}
        end;
      Как реализована функция Random не знаю. Но она точно берет значение из RandSeed, делает над ним какое-то преобразование и записывает обратно новое значение этой переменной.
        _randseed := _randseed * 214013 + 2531011 mod 232
        random := _randseed div 216
        вернуть random

        деление нужно для того, чтобы уменьшить предсказуемость младших битов random
          Сейчас посмотрел в отладчике, как работает стандартная функция Random, получил примерно такой код:
          ExpandedWrap disabled
            function iRandom(A:LongInt):LongWord;
             var i:LongWord;
                 j:Int64;
             begin
             i:=RandSeed*$8088405+1;
             RandSeed:=i;
             j:=Int64(i)*A;
             iRandom:=j shr 32;
             end;
            Ну множитель и сдвиг другие, ето понятно...
            но почему shr 32? :)
            ---
            тьфу ты... 64 бита.

            Ето в каком? в fpc 64-разр. рандом? Или в tmt?
            Сообщение отредактировано: Visitor -
              Takoi generat bul v pervuh rersiyah stl ():
              class Randint
              {
                   unsigned long randx;//Ravnomernoe raspredelenie [0,max]
              public:
                               Randint(long s=0){randx=s;}
                   void      seed(long s){randx=s;}

                   //privedennue magi4eskie 4isla nujnu dlya
                   //vudeleniya 31 bita iz 32-bitnogo long
                   long abs(long x){return x&0x7fffffff;}
                   static double max(){return 2147483648.0;}
                   long draw(){return randx=randx*1103515245+12345;}
                   double fdraw(){return abs(draw()/max());}
                   long operator(){return abs(draw());}
              };
              Vo vsyakom tak stait v Straustrup'e(3-e izdanie).
                Цитата Visitor, 20.10.03, 23:31:22
                Ну множитель и сдвиг другие, ето понятно...
                но почему shr 32? :)
                ---
                тьфу ты... 64 бита.

                Ето в каком? в fpc 64-разр. рандом? Или в tmt?

                Может я чего то и напутал при переводе в паскаль, в оригинале (в файле скомпилированном Делфи6) функция была такой:
                ExpandedWrap disabled
                   
                  ; IN:     EAX
                  ; OUT:  EAX
                  push ebx
                  xor ebx,ebx
                  imul edx,[ebx+RandSeed],$8088405
                  inc edx
                  mov [ebx+RandSeed],edx
                  mul edx
                  mov eax,edx
                  pop ebx
                  ret
                Сообщение отредактировано: albom -
                  Угу... А я и не думал, что борланд с микрософтом в етом направлении почесаться могут :)))
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0.0860 ]   [ 15 queries used ]   [ Generated: 6.10.26, 00:50 GMT ]