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

рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдЬрдирд░реЗрдЯрд░ рдХреА рднреЗрджреНрдпрддрд╛ рдкрд░ рд▓реЗрдЦ рдЕрдХреНрд╕рд░ Habr├й рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд▓рдЧреЗред рдпрд╣ рд╡рд┐рд╖рдп рдЕрддреНрдпрдВрдд рд╡реНрдпрд╛рдкрдХ рд╣реИ рдФрд░ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдореЗрдВ рдореБрдЦреНрдп рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдХрдЯ рдХреЗ рддрд╣рдд рдП рд╕реЗ рдЬреЗрдб рддрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рд╣реИред рд▓реЗрдЦ рдПрдХ рдкрд╢реНрдЪрд┐рдореА рдмреНрд▓реЙрдЧ рдФрд░ рд▓реЗрдЦрдХ рдХреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкрд░рд┐рд╡рд░реНрдзрди рд╕реЗ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдореБрдлреНрдд рдЕрдиреБрд╡рд╛рдж рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдп рдлреАрдбрдмреИрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдФрд░ рдЬреНрдЮрд╛рди рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рд╣реИред
рдЫрд╡рд┐

рдкрд░рд┐рдЪрдп


рд░реИрдВрдбрдо рдирдВрдмрд░ рдЬрдирд░реЗрдЯрд░ рд╡реЗрдм рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдЙрдкрдпреЛрдЧ рдХреА рдПрдХ рдЫреЛрдЯреА рд╕реВрдЪреА:


рдЧреИрд░-рдЖрдпрд╛рдореА рд╕реЗ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреНрд░рдо рдХреЛ рдХреИрд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рдП?


рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдПрдХ рдХреНрд░рдо рджреЗрдВ: 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ред рдХреНрдпрд╛ рд╡рд╣ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╣реИ? рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЪрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдЦреНрдд рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИред рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЪрд░ рдПрдХ рдорд╛рддреНрд░рд╛ рд╣реИ рдЬреЛ рдПрдХ рдкреНрд░рдпреЛрдЧ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХрдИ рдореВрд▓реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдорд╛рдк рдХреЗ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рдореВрд▓реНрдп рдХреЗ рдкреНрд░рдХрдЯ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕рдХреА рдорд╛рдк рдХреА рд╕рдЯреАрдХ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдорд╛рд░реЗ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред рдЕрдм рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпреЗ рд╕рдВрдЦреНрдпрд╛рдПрдБ рдХреАрдмреЛрд░реНрдб рдХреА рд╢реАрд░реНрд╖ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдмрди рдЧрдИрдВред "рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдХрд╕реНрдорд┐рдХ рдирд╣реАрдВ рд╣реИ" - рдЖрдк рдХрд╛ рджрд╛рд╡рд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рддреБрд░рдВрдд рдЕрдЧрд▓реЗ рдирдВрдмрд░ рдХреЛ рдирд╛рдо рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдЖрдк рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рд╣реЛрдВрдЧреЗред рд╡рд░реНрдгреЛрдВ рдХреЗ рдмреАрдЪ рдирд┐рд░реНрднрд░рддрд╛ рди рд╣реЛрдиреЗ рдкрд░ рд╣реА рдХреНрд░рдо рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдпреЗ рдкреНрд░рддреАрдХ рдмреИрд░рд▓ рдХреЛ рд▓реЛрдЯреНрдЯреЛ рдореЗрдВ рдЦреАрдВрдЪрдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдЕрдиреБрдХреНрд░рдо рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╣реЛрдЧрд╛ред

рдереЛрдбрд╝рд╛ рдФрд░ рдЬрдЯрд┐рд▓ рдЙрджрд╛рд╣рд░рдг рдпрд╛ рдкрд╛рдИ



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

рдПрдХ рдЫрджреНрдо рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдЬрдирд░реЗрдЯрд░ (PRNG) рдФрд░ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдЬрдирд░реЗрдЯрд░ (RNG) рдХреЗ рдмреАрдЪ рдЕрдВрддрд░


рдПрдиреНрдЯреНрд░рд╛рдкреА рдХреЗ рд╕реНрд░реЛрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдиреНрдЯреНрд░рд╛рдкреА рдХреЛ рд╕рдВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдЬрдирд░реЗрдЯрд░ (RNG) рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп (рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп, рдмреАрдЬ) рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред PRNG рдПрдХ рдПрдХрд▓ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдЗрд╕рдХрд╛ рдЫрджреНрдо рдпрд╛рджреГрдЪреНрдЫрд┐рдХрддрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИ, рдФрд░ RNG рд╣рдореЗрд╢рд╛ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдиреНрдЯреНрд░рд╛рдкреА рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕реНрд░реЛрддреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдЙрдЪреНрдЪ рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓рд╛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдореВрд▓реНрдп рд╣реЛрддрд╛ рд╣реИред
рдПрдиреНрдЯреНрд░реЙрдкреА рд╡рд┐рдХрд╛рд░ рдХрд╛ рдПрдХ рдЙрдкрд╛рдп рд╣реИред рд╕реВрдЪрдирд╛ рдПрдиреНрдЯреНрд░рд╛рдкреА рд╕реВрдЪрдирд╛ рдХреА рдЕрдирд┐рд╢реНрдЪрд┐рддрддрд╛ рдпрд╛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рддрддрд╛ рдХрд╛ рдПрдХ рдЙрдкрд╛рдп рд╣реИред
рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ RNG = PRNG + рдПрдВрдЯреНрд░реЛрдкреА рдХрд╛ рд╕реНрд░реЛрддред

PRSP рдХрдордЬреЛрд░рд┐рдпрд╛рдБ




рд░реИрдЦрд┐рдХ рдмрдзрд╛рдИ PRNG (LCPRNG)


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

рдЫрд╡рд┐

рдЬрд╣рд╛рдБ (рдЧреБрдгрдХ), c (рдпреЛрдЬрдХ), m (рдорд╛рд╕реНрдХ) рдХреБрдЫ рдкреВрд░реНрдгрд╛рдВрдХ рдЧреБрдгрд╛рдВрдХ рд╣реИрдВред рдкрд░рд┐рдгрд╛рдореА рдЕрдиреБрдХреНрд░рдо рдмреАрдЬ X0 рдХреА рдкрд╕рдВрдж рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЕрдиреБрдХреНрд░рдо рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВред

рдЧреБрдгрд╛рдВрдХ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдРрд╕реЗ рдЧреБрдг рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдЕрд╡рдзрд┐ рдХреА рдЕрдзрд┐рдХрддрдо рдЕрд╡рдзрд┐ (рдЕрдзрд┐рдХрддрдо рд▓рдВрдмрд╛рдИ рдореАрдЯрд░ рд╣реИ) рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН, рдЬрд┐рд╕ рдХреНрд╖рдг рд╕реЗ рдЬрдирд░реЗрдЯрд░ рдЪрдХреНрд░ [1] рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИред

рдЬрдирд░реЗрдЯрд░ рдХреЛ рдХрдИ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдПрдБ X0, X1, X2, X3 рджреЗрдВред рдпрд╣ рд╕рдореАрдХрд░рдгреЛрдВ рдХреА рдПрдХ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ

рдЫрд╡рд┐

рдЗрд╕ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЧреБрдгрд╛рдВрдХ a, c, m рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ [8] рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЗрд╕ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд╣рд▓ рдХрд░рдирд╛ рдпрд╛ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛ред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХрд┐рд╕реА рднреА рдорджрдж рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВред

рд░реИрдЦрд┐рдХ рд╕рд░реНрд╡рд╛рдВрдЧрд╕рдо рд╡рд┐рдзрд┐ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА


рд░реИрдЦрд┐рдХ рд╕рд░реНрд╡рд╛рдВрдЧрд╕рдо рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкреНрд▓рдорд╕реНрдЯреЗрдб рд╣реИ - рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЬрд┐рд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ [4] (рдПрдХ рдСрдирд▓рд╛рдЗрди рд▓реЙрдиреНрдЪ рд╣реИ) рдФрд░ рдпрд╣рд╛рдВ [5] ред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╡рд░реНрдгрди [9] рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЬрд╛рд╡рд╛ рдореЗрдВ рд╕рд░реНрд╡рд╛рдВрдЧрд╕рдо рд╡рд┐рдзрд┐ рдХрд╛ рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред

 public static int a = 45; public static int c = 21; public static int m = 67; public static int seed = 2; public static int getRand() { seed = (a * seed + c) % m; return seed; } public static void main(String[] args) { for(int i=0; i<30; i++) System.out.println(getRand()); } 


рд╕рд╛рдЗрдЯ [4] рдкрд░ 20 рдирдВрдмрд░ рднреЗрдЬрдХрд░, рдЖрдк рд╕рдВрднрд╡рддрдГ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬрд┐рддрдиреА рдЕрдзрд┐рдХ рд╕рдВрдЦреНрдпрд╛, рдЙрддрдиреА рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ред

рдЬрд╛рд╡рд╛ рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдЬрдирд░реЗрдЯрд░ рдХреЛ рд╣реИрдХ рдХрд░рдирд╛


рдХрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдПрдВ, рдЬреИрд╕реЗ C (рд░реИрдВрдб), C ++ (рд░реИрдВрдб), рдФрд░ Java LCPRNG рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдк java.utils рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреИрд╕реЗ рд╣реИрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВред рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб (jdk1.7) рдореЗрдВ рдЬрд╛рдХрд░, рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╕реНрдерд┐рд░рд╛рдВрдХ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ

 private static final long multiplier = 0x5DEECE66DL; // 25214903917 private static final long addend = 0xBL; // 11 private static final long mask = (1L << 48) - 1; // 281474976710655 = 2^48 тАУ 1 


Java.utils.Randon.nextInt () рд╡рд┐рдзрд┐ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ (рдпрд╣рд╛рдБ рдмрд┐рдЯреНрд╕ == 32)

 protected int next(int bits) { long oldseed, nextseed; AtomicLong seed = this.seed; do { oldseed = seed.get(); nextseed = (oldseed * multiplier + addend) & mask; } while (!seed.compareAndSet(oldseed, nextseed)); return (int)(nextseed >>> (48 - bits)); } 


рдкрд░рд┐рдгрд╛рдо 48-32 = 16 рдмрд┐рдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рджрд╛рдИрдВ рдУрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдЯреНрд░рдВрдХреЗрдЯреЗрдб-рдмрд┐рдЯреНрд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдмреНрд▓реИрдХ-рдмреЙрдХреНрд╕ рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдкреНрд░рд┐рдп рд╣реИ, рдЖрдкрдХреЛ рдмреНрд░реВрдЯ-рдмрд▓ рдореЗрдВ рдПрдХ рдФрд░ рд▓реВрдк рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдмреНрд░реВрдЯ-рдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣реИрдХрд┐рдВрдЧ рд╣реЛрдЧреАред

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рд▓рдЧрд╛рддрд╛рд░ рджреЛ рдЙрддреНрдкрдиреНрди рд╕рдВрдЦреНрдпрд╛рдПрдБ X1 рдФрд░ x2 рдЬрд╛рдирддреЗ рд╣реИрдВред рдлрд┐рд░ рдЖрдкрдХреЛ 2 ^ 16 = 65536 рд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рдХрд▓реНрдк рдЪреБрдирдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдФрд░ рд╕реВрддреНрд░ рдХреЛ X1 рдкрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВ:

 ((x1*multiplier + addend) & mask) << 16 


рдЬрдм рддрдХ рдпрд╣ x2 рдХреЗ рдмрд░рд╛рдмрд░ рди рд╣реЛ рдЬрд╛рдПред рдЬрд╛рдирд╡рд░ рдмрд▓ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЗрд╕ рддрд░рд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ

 import java.lang.reflect.Field; import java.util.Random; import java.util.concurrent.atomic.AtomicLong; public class PasswordCracking { public static final long multiplier = 0x5DEECE66DL; public static final long addend = 0xBL; public static final long mask = (1L << 48) - 1; public static void main(String[] args) { Random random = new Random(); long v1 = random.nextInt(); long v2 = random.nextInt(); long v3 = random.nextInt(); long v4 = random.nextInt(); System.out.println("v1=" + v1 + "\nv2=" + v2 + "\nv3=" + v3 + "\nv4=" + v4); // brute-force seed for (int i = 0; i < 65536; i++) { long seed = (((long) v1) << 16) + i; int nextInt = (int)(((seed * multiplier + addend) & mask) >>> 16); if (nextInt == v2) { System.out.println("Seed found: " + seed); Random crackingRandom = new Random(); try { /* set the seed for Random to be convinced that we have found the right seed because constructor Random (long seed) uses the private static long initialScramble (long seed) { return (seed ^ multiplier) & mask; } for simplicity will use Reflection */ Field privateSeedField = Random.class.getDeclaredField("seed"); privateSeedField.setAccessible(true); AtomicLong crackingSeed = (AtomicLong)privateSeedField.get(crackingRandom); crackingSeed.set(seed); }catch(Exception e) { System.out.println(e.toString()); System.exit(1); } long cv1 = crackingRandom.nextInt(); long cv2 = crackingRandom.nextInt(); long cv3 = crackingRandom.nextInt(); long cv4 = crackingRandom.nextInt(); System.out.println("Set fiend seed and generate random numbers"); System.out.println("cv1=" + cv1 + "\ncv2=" + cv2 + "\ncv3=" + cv3 + "\ncv4=" + cv4); break; } } } } 


рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧрд╛:

 v1 = -1184958941 v2 = 274285127 v3 = -1566774765 v4 = 30466408 Seed found: -77657469128792 Set fiend seed and generate random numbers cv1 = 274285127 cv2 = -1566774765 cv3 = 30466408 cv4 = -803980434 


рдпрд╣ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдмрд╣реБрдд рдкрд╣рд▓реЗ рдмреАрдЬ рдирд╣реАрдВ рдорд┐рд▓рд╛, рд▓реЗрдХрд┐рди рдмреАрдЬ рджреВрд╕рд░реА рд╕рдВрдЦреНрдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рдерд╛ред рдореВрд▓ рдмреАрдЬ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрдИ рдСрдкрд░реЗрд╢рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдЬрд╛рд╡рд╛ рдмреАрдЬ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВ рдХрд░рддрд╛ рдерд╛ред

 public static long getPreviousSeed(long prevSeed) { long seed = prevSeed; // reverse the addend from the seed seed -= addend; // reverse the addend long result = 0; // iterate through the seeds bits for (int i = 0; i < 48; i++) { long mask = 1L << i; // find the next bit long bit = seed & mask; // add it to the result result |= bit; if (bit == mask) { // if the bit was 1, subtract its effects from the seed seed -= multiplier << i; } } System.out.println("Previous seed: " + result); return result; } 


рдФрд░ рдЕрдм рд╕реЛрд░реНрд╕ рдХреЛрдб рдореЗрдВ рдмрджрд▓реЗрдВ
crackingSeed.set (рдмреАрдЬ);
рдкрд░
crackingSeed.set (getPrepretSeed (рдмреАрдЬ));

рдФрд░ рдпрд╣, рд╣рдордиреЗ рдЬрд╛рд╡рд╛ рдореЗрдВ PRNG рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХреНрд░реИрдХ рдХрд┐рдпрд╛ рд╣реИред

PHP рдореЗрдВ PRNG Mersenne рдЯреНрд╡рд┐рд╕реНрдЯрд░ рдХреЛ рд╣реИрдХ рдХрд░рдирд╛


Mersenne Twister рдЫрджреНрдо рдЖрдпрд╛рдореА рд╕рдВрдЦреНрдпрд╛ рдкреИрджрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЧреИрд░-рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдореБрдЦреНрдп рд▓рд╛рдн рдкреАрдврд╝реА рдХреА рдЧрддрд┐ рдФрд░ 2 ^ 19937 - 1 рдХреА рдПрдХ рд╡рд┐рд╢рд╛рд▓ рдЕрд╡рдзрд┐ рд╣реИ, рдЗрд╕ рдмрд╛рд░ рд╣рдо php рд╕реНрд░реЛрдд рдХреЛрдб рд╕рдВрд╕реНрдХрд░рдг 5.4.6 рдореЗрдВ mt_srand () рдФрд░ mt_rand () рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗред

рдлрд╝рд╛рдЗрд▓ рд╕рд╛рдордЧреНрд░реА / рдкрд╛рда / рдорд╛рдирдХ / рд╕рдВрдХреНрд╖рд┐рдкреНрдд_рд╕рдВрдЧреНрд░рд╣
 #define MT_N (624) /* rand.c */ php_uint32 state[MT_N+1]; /* state vector + 1 extra to not violate ANSI C */ php_uint32 *next; /* next random value is computed from here */ int left; /* can *next++ this many times before reloading */ unsigned int rand_seed; /* Seed for rand(), in ts version */ zend_bool rand_is_seeded; /* Whether rand() has been seeded */ zend_bool mt_rand_is_seeded; /* Whether mt_rand() has been seeded */ 



рдлрд╝рд╛рдЗрд▓ /ext/standard/rand.c рдХреА рд╕рд╛рдордЧреНрд░реА:
 #define N MT_N /* length of state vector */ #define M (397) /* a period parameter */ #define hiBit(u) ((u) & 0x80000000U) /* mask all but highest bit of u */ #define loBit(u) ((u) & 0x00000001U) /* mask all but lowest bit of u */ #define loBits(u) ((u) & 0x7FFFFFFFU) /* mask the highest bit of u */ #define mixBits(u, v) (hiBit(u)|loBits(v)) /* move hi bit of u to hi bit of v */ #define twist(m,u,v) (m ^ (mixBits(u,v)>>1) ^ ((php_uint32)(-(php_int32)(loBit(u))) & 0x9908b0dfU)) /* {{{ php_mt_reload */ static inline void php_mt_reload(TSRMLS_D) { /* Generate N new values in state Made clearer and faster by Matthew Bellew (matthew.bellew@home.com) */ register php_uint32 *state = BG(state); register php_uint32 *p = state; register int i; for (i = N - M; i--; ++p) *p = twist(p[M], p[0], p[1]); for (i = M; --i; ++p) *p = twist(p[MN], p[0], p[1]); *p = twist(p[MN], p[0], state[0]); BG(left) = N; BG(next) = state; } /* }}} */ /* {{{ php_mt_initialize */ static inline void php_mt_initialize(php_uint32 seed, php_uint32 *state) { /* Initialize generator state with seed See Knuth TAOCP Vol 2, 3rd Ed, p.106 for multiplier. In previous versions, most significant bits (MSBs) of the seed affect only MSBs of the state array. Modified 9 Jan 2002 by Makoto Matsumoto. */ register php_uint32 *s = state; register php_uint32 *r = state; register int i = 1; *s++ = seed & 0xffffffffU; for( ; i < N; ++i ) { *s++ = ( 1812433253U * ( *r ^ (*r >> 30) ) + i ) & 0xffffffffU; r++; } } /* }}} */ /* {{{ php_mt_srand */ PHPAPI void php_mt_srand(php_uint32 seed TSRMLS_DC) { /* Seed the generator with a simple uint32 */ php_mt_initialize(seed, BG(state)); php_mt_reload(TSRMLS_C); /* Seed only once */ BG(mt_rand_is_seeded) = 1; } /* }}} */ /* {{{ php_mt_rand */ PHPAPI php_uint32 php_mt_rand(TSRMLS_D) { /* Pull a 32-bit integer from the generator state Every other access function simply transforms the numbers extracted here */ register php_uint32 s1; if (BG(left) == 0) { php_mt_reload(TSRMLS_C); } --BG(left); s1 = *BG(next)++; s1 ^= (s1 >> 11); s1 ^= (s1 << 7) & 0x9d2c5680U; s1 ^= (s1 << 15) & 0xefc60000U; return ( s1 ^ (s1 >> 18) ); } 


рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ php_mt_reload рдХреЛ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рдФрд░ php_mt_rand 624 рдмрд╛рд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪрд▓реЛ рдЕрдВрдд рд╕реЗ рд╣реИрдХрд┐рдВрдЧ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, php_mt_rand () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрдд рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЙрд▓реНрдЯрд╛ рдХрд░рддреЗ рд╣реИрдВред рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ (s1 ^ (s1 >> 18))ред рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ, рдСрдкрд░реЗрд╢рди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

101101110101111001 11111001110010 s1
0000000000000000001011011101011110011111111001110010 s1 >> 18
101101110101111001 01001110100101 s1 ^ (s1 >> 18)
рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ 18 рдмрд┐рдЯреНрд╕ (рдмреЛрд▓реНрдб рдореЗрдВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдП рдЧрдП) рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣реЗред
рд╣рдо рдмрд┐рдЯ рд╢рд┐рдлреНрдЯ рдФрд░ xor рдХреЛ рдЗрдиреНрд╡рд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрддреЗ рд╣реИрдВ

 public static long unBitshiftRightXor(long value, long shift) { // we part of the value we are up to (with a width of shift bits) long i = 0; // we accumulate the result here long result = 0; // iterate until we've done the full 32 bits while (i * shift < 32) { // create a mask for this part long partMask = (-1 << (32 - shift)) >>> (shift * i); // obtain the part long part = value & partMask; // unapply the xor from the next part of the integer value ^= part >>> shift; // add the part to the result result |= part; i++; } return result; } public static long unBitshiftLeftXor(long value, long shift, long mask) { // we part of the value we are up to (with a width of shift bits) long i = 0; // we accumulate the result here long result = 0; // iterate until we've done the full 32 bits while (i * shift < 32) { // create a mask for this part long partMask = (-1 >>> (32 - shift)) << (shift * i); // obtain the part long part = value & partMask; // unapply the xor from the next part of the integer value ^= (part << shift) & mask; // add the part to the result result |= part; i++; } return result; } 


рддрдм php_mt_rand () рдлрд╝рдВрдХреНрд╢рди рдХреА рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЙрд▓реНрдЯрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛

 long value = output; value = unBitshiftRightXor(value, 18); value = unBitshiftLeftXor(value, 15, 0xefc60000); value = unBitshiftLeftXor(value, 7, 0x9d2c5680); value = unBitshiftRightXor(value, 11); 


рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ Mersenne Twister рджреНрд╡рд╛рд░рд╛ 624 рд▓рдЧрд╛рддрд╛рд░ рд╕рдВрдЦреНрдпрд╛рдПрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВ, рддреЛ рдЗрди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдЗрди рд▓рдЧрд╛рддрд╛рд░ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдкрд░, рд╣рдореЗрдВ Mersenne Twister рдХреА рдкреВрд░реНрдг рд╕реНрдерд┐рддрд┐ рдорд┐рд▓рддреА рд╣реИ, рдФрд░ рд╣рдо рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЬреНрдЮрд╛рдд рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП php_mt_reload рдЪрд▓рд╛рдХрд░ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдж рдХреЗ рдореВрд▓реНрдп рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╣реИрдХрд┐рдВрдЧ рдПрд░рд┐рдпрд╛


рдЕрдЧрд░ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯреВрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЧрд▓рдд рд╣реИрдВред рджрд┐рд▓рдЪрд╕реНрдк рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдПрдбреЛрдм рдлреНрд▓реИрд╢ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдЬрдирд░реЗрдЯрд░ (рдПрдХреНрд╢рди рд╕реНрдХреНрд░рд┐рдкреНрдЯ 3.0) рд╣реИред рдЗрд╕рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдмрдВрдж рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ рдмреАрдЬ рдХрд╛рд░реНрдп рдХреА рдХрдореА рд╣реИред рдЗрд╕рдореЗрдВ рдореБрдЦреНрдп рд░реБрдЪрд┐ рдХрдИ рдСрдирд▓рд╛рдЗрди рдХреИрд╕реАрдиреЛ рдФрд░ рдСрдирд▓рд╛рдЗрди рдкреЛрдХрд░ рдореЗрдВ рдЙрдкрдпреЛрдЧ рд╣реИред
рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдХрдИ рдХреНрд░рдо рд╣реИрдВ, рдбреЙрд▓рд░ рдХреЗ рд╡рд┐рдирд┐рдордп рджрд░ рд╕реЗ рд▓реЗрдХрд░ рд╣рд░ рджрд┐рди рдпрд╛рддрд╛рдпрд╛рдд рдореЗрдВ рдЦрд░реНрдЪ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд░рд╛рд╢рд┐ рддрдХред рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдбреЗрдЯрд╛ рдореЗрдВ рдПрдХ рдкреИрдЯрд░реНрди рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдХрд╛рдо рдирд╣реАрдВ рд╣реИред

рдПрдХ рдЫрджреНрдо рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдЬрдирд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рддрд░рдг рдХреА рд╕реНрдерд╛рдкрдирд╛


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

рддреНрд░рд┐рдХреЛрдгреАрдп рд╡рд┐рддрд░рдг

рд╣рдо C99 рдХреА рднрд╛рд╖рд╛ рдореЗрдВ рддреНрд░рд┐рдХреЛрдгреАрдп рд╡рд┐рддрд░рдг [7] рдХреЗ рд╕рд╛рде рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЪрд░ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрддреЗ рд╣реИрдВред
 double triangular(double a, double b, double c) { double U = rand() / (double) RAND_MAX; double F = (c - a) / (b - a); if (U <= F) return a + sqrt(U * (b - a) * (c - a)); else return b - sqrt((1 - U) * (b - a) * (b - c)); } 


рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЪрд░ рд░реИрдВрдб () рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рддреНрд░рд┐рдХреЛрдгреАрдп рд╡рд┐рддрд░рдг рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рддрд░рдг рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП a -40, b = 100, c = 50, 10,000,000 рдорд╛рдкреЛрдВ рдХрд╛ рдЧреНрд░рд╛рдл рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛

рдЫрд╡рд┐

рдШрд╛рддрд╛рдВрдХ рд╡рд┐рддрд░рдг


рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдк рддреЗрдЬреА рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЪрд░ рдХрд╛ рд╕реЗрдВрд╕рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, F (x) = 1 - exp (-lambda * x)ред рдлрд┐рд░ рд╕рдореАрдХрд░рдг y = 1 - exp (-lambda * x) рдХреЗ рд╕рдорд╛рдзрд╛рди рд╕реЗ рд╣рдореЗрдВ x = -log (1-y) / lambda рдорд┐рд▓рддрд╛ рд╣реИред
рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдВрддрд┐рдо рд╕реВрддреНрд░ рдореЗрдВ рд▓рдШреБрдЧрдгрдХ рдХреЗ рддрд╣рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЕрдВрддрд░рд╛рд▓ рдкрд░ рдПрдХ рд╕рдорд╛рди рд╡рд┐рддрд░рдг рд╣реИ [0,1), рдЬреЛ рд╣рдореЗрдВ рдПрдХ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реВрддреНрд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрдиреБрдХреНрд░рдо рднреА рд╡рд┐рддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ: x = -log (y) / lambda, рдЬрд╣рд╛рдВ y рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЪрд░ рд╣реИ (рд░реИрдВрдб) ()ред

PRNG рдкрд░реАрдХреНрд╖рдг


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

рдкреНрд░рд╕рд┐рджреНрдз рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЕрдЧрд▓реЗ рдмрд┐рдЯ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд╣реИ - рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЬреЛ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рддрд╛рдХрдд рдХреЗ рд▓рд┐рдП рдЫрджреНрдо рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдЬрдирд░реЗрдЯрд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдПрдХ рдмрд╣реБрдкрдж рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреНрд░рдо рдХреЗ рдкрд╣рд▓реЗ k рдмрд┐рдЯреНрд╕ рдХреЛ рдЬрд╛рдирдХрд░ a k + 1 рдмрд┐рдЯреНрд╕ рдХреЛ bits рд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ, рдПрдХ рдЕрд▓рдЧ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд░рд╣реА рд╣реИ рдХрд┐ рдЬрдирд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рд╕рдВрдЦреНрдпрд╛рдУрдВ рдпрд╛ рдмрд┐рдЯреНрд╕ рдХрд╛ рдХреНрд░рдо рдХрд┐рддрдирд╛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╣реИред рдЖрдорддреМрд░ рдкрд░, рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ DIEHARD рдпрд╛ NISTред 1982 рдореЗрдВ рдПрдВрдбреНрд░рдпреВ рдпрд╛рдУ рдиреЗ рд╕рд╛рдмрд┐рдд рдХрд░ рджрд┐рдпрд╛ рдХрд┐ "рдЕрдЧрд▓рд╛ рдмрд┐рдЯ рдЯреЗрд╕реНрдЯ" рдкрд╛рд╕ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдЬрдирд░реЗрдЯрд░ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░реЗрдЧрд╛ рдЬреЛ рдХрд┐ рдмрд╣реБрдкрдж рд╕рдордп рдореЗрдВ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрдВрдЯрд░рдиреЗрдЯ [10] рдкрд░, рдЖрдк рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рддрд┐рд░реЛрдз рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд╛рдИрд╣рд╛рд░реНрдб рдкрд░реАрдХреНрд╖рдг рдФрд░ рдХрдИ рдЕрдиреНрдп рдХреЛ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЬреНрдЮрд╛рдд рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдЬрдирд░реЗрдЯрд░ рд╣реИрдХ




рд╕рдВрджрд░реНрдн


[рез] рдбреЛрдирд╛рд▓реНрдб рдиреБрде, рдж рдЖрд░реНрдЯ рдСрдлрд╝ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ (рдЦрдВрдб реиред рд╡реНрдпреБрддреНрдкрдиреНрди рдПрд▓реНрдЧреЛрд░рд┐рджрдо)
[реи] рдмреНрд░реВрд╕ рд╢реНрдиреЗрдпрд░, рдПрдкреНрд▓рд╛рдЗрдб рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА (рдЕрдзреНрдпрд╛рдп резрем)
[рек] www.staff.uni-mainz.de/pommeren/Kryptologie/Bitstrom/2_Analyse/LCGcrack.html
[рел] www.staff.uni-mainz.de/pommeren/Kryptologie99/English.html
[рем] en.wikipedia.org/wiki/Mersenne_twister
[[] En.wikipedia.org/wiki/Triangular_distribution
[[] En.wikipedia.org/wiki/Linear_Congruent_Method
[реп] zaic101.ru/files/728/using_linear_congruential_generators_for_cryptographic_purpose.pdf
[резреж] www.cacert.at/random
[резрез] www.cs.berkeley.edu/~daw/papers/ddj-netscape.html
[резреи] www.computerworld.com/s/article/9048438/Microsoft_confirms_that_XP_contains_random_number_generator_bug
[резрей] md5 raz0r.name/articles/magiya-sluchajnyx-chisel-chast-2/comment-page-1 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреАрдврд╝реА рдХрд╛ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЙрджрд╛рд╣рд░рдг рд╡рд░реНрдгрд┐рдд рд╣реИ

рдореВрд▓


jazzy.id.au/default/2010/09/20/cracking_random_number_generators_part_1.html
jazzy.id.au/default/2010/09/21/cracking_random_number_generators_part_2.html
jazzy.id.au/default/2010/09/22/cracking_random_number_generators_part_3.html
jazzy.id.au/default/2010/09/25/cracking_random_number_generators_part_4.html

Source: https://habr.com/ru/post/In151187/


All Articles