рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдЖрдк рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╡рд┐рд╡рд┐рдз рдмрд╛рдЗрдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рджреЗрдЦреЗрдВрдЧреЗ ред

рдХрд┐рд╕ рд▓реЗрдЦ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ


рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЫрджреНрдо-рдЖрдпрд╛рдореА рд╕рдВрдЦреНрдпрд╛рдПрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВ рдЬреЛ рдкрд░рд┐рдгрд╛рдо рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЧрддрд┐ рдореЗрдВ рднрд┐рдиреНрди рд╣реЛрддреА рд╣реИрдВред рдпрд╣ рд▓реЗрдЦ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдЬреЛ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди рд╕рдВрдЦреНрдпрд╛ рдкреАрдврд╝реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрд╛ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдФрд░ рдЬреЗрдбрдПрдХреНрд╕ рд╕реНрдкреЗрдХреНрдЯреНрд░рдо рдпрд╛ рдПрдордПрд╕рдПрдХреНрд╕ рдЬреИрд╕реЗ рдкреБрд░рд╛рдиреЗ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рд▓рд┐рдП рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ред

C ++ рд░реИрдВрдб


рдкрд╣рд▓реА рдмрд╛рдд рдПрдХ рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рд╕реА ++ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдШрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрддрд╛ рд╣реИ рд╡рд╣ рд░реИрдВрдб рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдЬреЛ 0 рдФрд░ RAND_MAX рдХреЗ рдмреАрдЪ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред RAND_MAX рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ stdlib.h рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ 32'767 рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓рд┐рдирдХреНрд╕ рдкрд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ ( рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреЗрдВ )ред рдпрджрд┐ рдЖрдкрдХреЗ рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВ рд░реИрдВрдб () 32'767 (0x7FFF) рдХреЗ рднреАрддрд░ рдирдВрдмрд░ рдЬреЗрдирд░реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдк рдмрдбрд╝реЗ рдЖрдХрд╛рд░ рдХрд╛ рд░реИрдВрдбрдо рдирдВрдмрд░ рдкрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╣рд▓ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

int64_t A = rand();
A <<= 15; //   15,   7FFF  15 
A |= rand();
A <<= 15;
A |= rand();
A <<= 15;
A |= rand();
A <<= 3;
A |= rand() & 0b111; //  3  


рдкреБрд░рд╛рдиреЗ рд╕реА рдореЗрдВ рд░реИрдВрдб рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рд░рд▓ рдерд╛ рдФрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рдерд╛:

static unsigned long int next = 1;

int rand()
{
  next = next * 1103515245 + 12345;
  return (unsigned int)(next / 65536) % 32768;
}

рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╡рд┐рддрд░рдг рдирд╣реАрдВ рдерд╛ рдФрд░ рдЕрдм C ++ рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реБрдЖ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдорд╛рдирдХ рд╕реА ++ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ, рдЬрд┐рдирдХреА рдЪрд░реНрдЪрд╛ рдиреАрдЪреЗ рдХреА рдЧрдИ рд╣реИред

рд╕реА ++ 11 рдПрд╕рдЯреАрдПрд▓ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ


рдпрд╛рджреГрдЪреНрдЫрд┐рдХрддрд╛ рдХреА рдпрд╣ рд╡рд┐рд╡рд┐рдзрддрд╛ C ++ 11 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреА рдФрд░ рдЗрд╕рдореЗрдВ рдирд┐рдореНрди рд╡рд░реНрдЧ рдХреЗ рд╕рдореВрд╣ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: minstd_rand, mt19937, ranlux, knuth_b рдФрд░ рдЙрдирдХреА рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рд╡рд┐рдзрддрд╛рдПрдБред

рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рдЫрджреНрдо-рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЬрдирд░реЗрдЯрд░ рдХрд╛ "рдЕрдирд╛рдЬ" рд╡рд░реНрддрдорд╛рди рд╕рдордп рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛, рдХреБрдЫ рд░реЗрдЯреНрд░реЛ (рдФрд░ рди рдХреЗрд╡рд▓) рдЦреЗрд▓ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреАрдмреЛрд░реНрдб / рдЬреЙрдпрд╕реНрдЯрд┐рдХ рд╕реЗ рдХреАрд╕реНрдЯреНрд░реЛрдХреНрд╕ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░рд╛рд▓ред рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп std :: random_device рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдордп (NULL) рд╕реЗ рдмреЗрд╣рддрд░ рдЕрдирд╛рдЬ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд┐рдВрдбреЛрдЬ рдкрд░ MinGW рд╕рдВрдХрд▓рдХ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдлрд┐рд░ рднреАтАж

// ,   :
#include <random>
#include <ctime>

std::mt19937 engine; // mt19937    
engine.seed(std::time(nullptr));
/*
 ,    UNIX--    MinGW
std::random_device device;
engine.seed(device());
*/
int val = engine(); //   

рдПрд╕рдЯреАрдПрд▓ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдореЗрдВ рдХреБрдЫ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд░реИрдВрдб () рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдирд┐рдореНрди-рдЧреБрдгрд╡рддреНрддрд╛ рдЕрдиреБрдХреНрд░рдо рджреЗрддреЗ рд╣реИрдВред

PRNG - рдЫрджреНрдо рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдЬрдирд░реЗрдЯрд░


рдЖрдк рдЗрд╕ рдирд╛рдо рдХреЛ рд░реИрдЦрд┐рдХ рд╕рд░реНрд╡рд╛рдВрдЧрд╕рдо рд╡рд┐рдзрд┐ рдХрд╛ рдкрд░реНрдпрд╛рдп рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВред PRNG рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╕реА рдореЗрдВ рд░реИрдВрдб рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рдорд╛рди рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рд╕реНрдерд┐рд░рд╛рдВрдХ рдореЗрдВ рднрд┐рдиреНрди рд╣реИрдВред

unsigned PRNG()
{
  static unsigned seed = 1; //     0
  seed = (seed * 73129 + 95121) % 100000;
  return seed;
}

PRNG рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрдИ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рддреЗрдЬрд╝ рдФрд░ рдЖрд╕рд╛рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдмрдбрд╝реА рдЕрд╡рдзрд┐ рдирд╣реАрдВ рд╣реИред

Xorshift


рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рдХрдИ рднрд┐рдиреНрдирддрд╛рдПрдВ рд╣реИрдВ, рдЕрд╡рдзрд┐ рдФрд░ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддреА рд╣реИрдВред XorShift рдХрд╛ рд╡рд┐рд╡рд░рдг рдФрд░ рдХрд┐рд╕реНрдореЗрдВ рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдпрд╛ Habr├й рдкрд░ рджреЗрдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред рдореИрдВ 128 рдбрд┐рдЧреНрд░реА рдореЗрдВ 2 рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рджреВрдВрдЧрд╛ред

struct seed_t
{
  unsigned x = 1; //     
  unsigned y = 123;
  unsigned z = 456;
  unsigned w = 768;
};

unsigned XorShift128()
{
  static seed_t s;
  unsigned t = s.x^(s.x<<11);
  s.x = s.y;
  s.y = s.z;
  s.z = s.w;
  s.w = (s.w^(s.w>>19)) ^ (t^(t>>8));
  return s.w;
}

рдпрд╣ рдЬрдирд░реЗрдЯрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдХреЛрдИ рд╡рд┐рднрд╛рдЬрди рдФрд░ рдЧреБрдгрди рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИрдВ - рдпрд╣ рдкреНрд░реЛрд╕реЗрд╕рд░ рдФрд░ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдкрд░ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рдЕрд╕реЗрдВрдмрд▓рд░ рдбрд┐рд╡реАрдЬрди / рдЧреБрдгрди рдирд┐рд░реНрджреЗрд╢ рдирд╣реАрдВ рд╣реИрдВ (PIC16, Z80, 6502)ред

Z26 рдПрдореБрд▓реЗрдЯрд░ рдореЗрдВ 8-рдмрд┐рдЯ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ


Z26 рдПрдХ рдкреБрд░рд╛рдиреЗ Atari2600 рдЙрдкрд╕рд░реНрдЧ рдХрд╛ рдПрдХ рдПрдореБрд▓реЗрдЯрд░ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдХреЛрдб рдореЗрдВ рдЖрдк 1-рдмрд╛рдЗрдЯ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдПрдХ рдЦреЛрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

// P2_sreg - static uint8_t
void P2_Read_Random()
{
  P2_sreg =
    (((((P2_sreg & 0x80) >> 7) ^
       ((P2_sreg & 0x20) >> 5)) ^
      (((P2_sreg & 0x10) >> 4) ^
       ((P2_sreg & 0x08) >> 3))) ^ 1) |
        (P2_sreg << 1);
  DataBus = P2_sreg;
}

рдПрдХ рдмрд╛рд░ рдореБрдЭреЗ z80 рдХреЗ рд▓рд┐рдП рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░рдирд╛ рдерд╛:

рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЛрдб
;    z26
; a - output
; rdseed - 1  
randz26:
    exx

    ld a,(rdseed)
    and 20h
    sra a
    sra a
    sra a
    sra a
    sra a
    ld h, a

    ld a,(rdseed)
    and 80h
    sra a
    sra a
    sra a
    sra a
    sra a
    sra a
    sra a
    xor h
    ld l, h
    
    ld a,(rdseed)
    and 08h
    sra a
    sra a
    sra a
    ld h, a

    ld a,(rdseed)
    and 10h
    sra a
    sra a
    sra a
    sra a
    xor h
    ld h, a
    ld a, l
    xor h
    xor 1

    ld h, a
    ld a,(rdseed)
    sla a
    or h
    ld (rdseed),a

    exx
    ret


рдЬреЛ Wingbermuehle рд╕реЗ Z80 рдХреЗ рд▓рд┐рдП рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ


рдпрджрд┐ рдЖрдк рдЬрд╝рд┐рд▓реЙрдЧ рд╡рд╛рд▓реА рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЖрдкрдХреЗ рдзреНрдпрд╛рди рдореЗрдВ рдЬреЛ рд╡рд┐рдВрдЧрдореНрдмрд░рдорд╣реЗрд▓ (рдХреЗрд╡рд▓ рдЬрд╝рд┐рд▓реЙрдЧ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ) рд╕реЗ рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВ:

; By Joe Wingbermuehle
; a res 1 byte - out val
; rdseed res 1 byte - need for rand. != 0
rand8:
        exx
        ld      hl,(rdseed)
        ld      a,r
        ld      d,a
        ld      e,(hl)
        add     hl,de
        add     a,l
        xor     h
        ld      (rdseed),hl
        exx
        ret

рдбреАрдУрдПрдо рдореЗрдВ рд░реИрдВрдбрдо рд╣рд╛рдЙрд╕ рдЬреЗрдирд░реЗрдЯрд░


рдЦреЗрд▓ рдХрдпрд╛рдордд рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдРрд╕реА рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдлрд╝рд╛рдЗрд▓ рд╣реИ рдЬрд┐рд╕реЗ m_random.c (рдХреЛрдб рджреЗрдЦреЗрдВ) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ , рдЬреЛ рдХрд┐ "рддрд╛рд▓рд┐рдХрд╛" рдпрд╛рджреГрдЪреНрдЫрд┐рдХрддрд╛ рдХреЗ рдХрд╛рд░реНрдп рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН , рдмрд┐рдЯ рдкрд╛рд░рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕реВрддреНрд░ рдФрд░ рдЬрд╛рджреВ рдирд╣реАрдВ рд╣реИрдВред

рдореИрдВ рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рдХреЛрдб рджреВрдВрдЧрд╛ рдЬреЛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рддрд╛ рд╣реИред

const uint8_t random_map[] =
{
  4,  1,   63, 3,
  64, 22,  54, 2,
  0,  52,  75, 34,
  89, 100, 23, 84
};

uint8_t get_random()
{
  static uint8_t index = 0;
  index = (index + 1) & 0xF; // 0xF,      random_map
  return random_map[index];
}

Z80 рдХреЗ рд▓рд┐рдП рд╡реИрд░рд┐рдХ
;   (  DOOM)
; rand_table -    .  
;                        256    .
; a - output num
randtab:
    exx
    ; index
    ld a, (rdseed)
    inc a
    ;and filter ; for crop array index
    ld (rdseed), a
    ; calc array address
    ld hl, rand_table
    ld d, 0
    ld e, a
    add hl, de
    ld a, (hl) ; get num from arr
    exx
    ret


рдмреЗрд╢рдХ, рдпрд╣ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдирд╣реАрдВ рд╣реИ рдФрд░ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдХреНрд░рдо рдЦреЗрд▓ рдХреЗ рджреМрд░рд╛рди рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рдХреЗ рд╕реНрддрд░ рдкрд░ рднреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рднреА рдмрд╣реБрдд рдЬрд▓реНрджреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд╝рд┐рдХ рддрд╛рдХрдд рдЖрдкрдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ рдФрд░ рдЖрдк рдХреБрдЫ рдРрд╕рд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдЬрд▓реНрджреА рд╕реЗ "рдЯрд╛рдЗрдк-рд░реИрдВрдбрдо" рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЖрдкрдХреЗ рд▓рд┐рдП рд╣реИред рд╡реИрд╕реЗ, рдХреНрд╡реЗрдХ 3 рдореЗрдВ, рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рд░рд▓ рджрд┐рдЦрддрд╛ рд╣реИ - рд░реИрдВрдб () рдФрд░ 0x7FFFред

RDRAND


рдХреБрдЫ рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдПрдХрд▓ рдХреЛрдбрд░ рдЕрдиреБрджреЗрд╢ - RDRAND рдХреЗ рд╕рд╛рде рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВред C ++ рдореЗрдВ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХреЛрдбрд╛рдВрддрд░рдХ рдЖрд╡реЗрд╖рдг рдХреЗ рд╕рд╛рде рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрджреЗрд╢ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЬреАрд╕реАрд╕реА рдореЗрдВ Immintrin.h рдлрд╝рд╛рдЗрд▓ рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ _rdrandXX_step рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрд┐рд╕реА рднреА рд╡рд┐рд╡рд┐рдзрддрд╛ рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ XX рдХрд╛ рдЕрд░реНрде рд╣реИ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдмрд┐рдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ 16, 32 рдпрд╛ 64 рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

#include <immintrin.h>

unsigned val;
_rdrand32_step(&val);

рдпрджрд┐ рдЖрдк рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдиреЗ -mrdrnd рдзреНрд╡рдЬ рдХреЛ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдпрд╛ рдЖрдкрдХрд╛ рдХрдВрдкрд╛рдЗрд▓рд░ / рдкреНрд░реЛрд╕реЗрд╕рд░ рдЗрд╕ рдЙрдкрдХрд░рдг рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдЬрдирд░реЗрдЯрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд╝рд┐рдХ рддрд╛рдХрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╡рд╛рд▓ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВред

рд╕рдорд╛рдкрди


рдПрд╕рдЯреАрдПрд▓ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ std :: minstd_rand рд╡рд░реНрдЧ рд╕рд╛рдзрд╛рд░рдг рд░реИрдВрдб () рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬрд╝ рд╣реИ рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдмрди рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдорд┐рдиреНрдЯрдб рдореЗрдВ рдЕрд╡рдзрд┐ рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рдирд╣реАрдВ рд╣реИрдВред рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╡рд┐рдВрдбреЛрдЬ рдФрд░ рдпреВрдирд┐рдХреНрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдореЗрдВ рдЕрдВрддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╡рд┐рд╖рдп рдкрд░ Infa


  • рд╕реА ++ 11 рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд▓реЗрдЦ: рдЖрдзреБрдирд┐рдХ рд╕реА ++ рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдкреАрдврд╝реА
  • рдПрд╕рдЯреАрдПрд▓ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдореЗрдВ рдЬрдирд░реЗрдЯрд░ рдХреНрдпрд╛ рд╣реИрдВ? рдирд┐рд░реНрд╡рд╛рд╕рди
  • рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдХреЗ рд╕рд╛рде XorShift рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рдХреА рд▓реЗрдЦ: tyk
  • рдЧрд┐рдЯ рдПрдореНрдпреВрд▓реЗрдЯрд░ z26ред рдлрд╝рд╛рдЗрд▓ c_pitfall2.c рдореЗрдВ рд░реИрдВрдбрдо рдХреЛрдб: git
  • рджрдордЪрд┐рдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЬрдирд░реЗрдЯрд░: рдЧрд┐рдЯ

PS рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рд▓реЗрдЦред рдХреНрдпрд╛ рд▓рд┐рдЦреЗрдВ, рдХреНрдпрд╛ рдЬреЛрдбрд╝рдирд╛ / рдХрдо рдХрд░рдирд╛ рд╣реИ

All Articles