Генератор xoshiro64 на Ассемблере
В качестве продолжения статьи про xoshiro128 реализация алгоритма xoshiro64 на Ассемблере. Напомню, что xoshiro (xoroshiro) - семейство высокоскоростных алгоритмов для генерации псевдослучайных чисел. Есть две разновидности xoshiro64, отличающиеся друг от друга только количеством операций умножения. Это, соответственно, версия xoshiro64* и xoshiro64**. Для работы генератор использует буфер размером в 2 DWORD'а.В оригинальном алгоритме отсутствует функция инициализации, там достаточно просто записать какие-то начальные ненулевые значения в рабочий буфер. Если вам надо инициализировать и "прогреть" генератор, то я сделал для этого функцию по аналогии с xoshiro128. Но это уже моя самодеятельность, в авторском алгоритме ничего такого нет.
Code (Assembler) : Убрать нумерацию
- ;---------------------------------------------
- ; Инициализация генератора случайных чисел
- ; stdcall long_jump,seed
- ;---------------------------------------------
- proc long_jump seed:DWORD
- locals
- s0 dd ?
- s1 dd ?
- endl
- pusha
- ; Начальное "засеивание" генератора
- mov edi,s
- mov eax,[seed]
- rol eax,1
- xor eax,0x1C580662
- stosd
- rol eax,3
- add eax,0x0B6F099F
- stosd
- ; Холостая прокрутка генератора для инициализации
- lea edi,[s0]
- push edi
- xor eax,eax
- stosd
- stosd
- xor ebx,ebx
- .loc_for_1:
- xor ecx,ecx
- .loc_for_2:
- mov eax,[.lj+ebx*4]
- and eax,1
- shl eax,cl
- jz @f
- mov esi,s
- lodsd
- xor [s0],eax
- lodsd
- xor [s1],eax
- @@:
- stdcall next
- inc ecx
- cmp ecx,32
- jb .loc_for_2
- inc ebx
- jnp .loc_for_1
- pop esi
- mov edi,s
- movsd
- movsd
- popa
- ret
- .lj: dd 0xB523952E
- dd 0x0B6F099F
- endp
Функции генерации соответствуют предъявляемым требованиям по уникальности и распределению результатов, а за счет использования операций умножения не допускают появления линейных артефактов в младших битах.
Code (Assembler) : Убрать нумерацию
- ;---------------------------------------------
- ; Получить случайное число xoshiro64*
- ; stdcall next
- ; на выходе EAX - случайное число
- ;---------------------------------------------
- proc next
- pusha
- xor edx,edx
- mov eax,[s+0*4]
- mov ecx,0x9E3779BB
- mul ecx
- mov [esp+28],eax
- mov eax,[s+0*4] ; s[0]
- mov ebx,[s+1*4] ; s[1]
- xor ebx,eax
- mov edx,ebx
- mov ebx,eax
- shr ebx,(32-26)
- shl eax,26
- or eax,ebx
- mov ebx,edx
- xor eax,ebx
- shl edx,9
- xor eax,edx
- mov [s+0*4],eax
- mov eax,ebx
- shr ebx,(32-13)
- shl eax,13
- or eax,ebx
- mov [s+1*4],eax
- popa
- ret
- endp
Code (Assembler) : Убрать нумерацию
- ;---------------------------------------------
- ; Получить случайное число xoshiro64**
- ; stdcall next
- ; на выходе EAX - случайное число
- ;---------------------------------------------
- proc next
- pusha
- xor edx,edx
- mov eax,[s+0*4]
- mov ecx,0x9E3779BB
- mul ecx
- mov ebx,eax
- shr ebx,(32-5)
- shl eax,5
- or eax,ebx
- xor edx,edx
- mov ecx,5
- mul ecx
- mov [esp+28],eax
- mov eax,[s+0*4] ; s[0]
- mov ebx,[s+1*4] ; s[1]
- xor ebx,eax
- mov edx,ebx
- mov ebx,eax
- shr ebx,(32-26)
- shl eax,26
- or eax,ebx
- mov ebx,edx
- xor eax,ebx
- shl edx,9
- xor eax,edx
- mov [s+0*4],eax
- mov eax,ebx
- shr ebx,(32-13)
- shl eax,13
- or eax,ebx
- mov [s+1*4],eax
- popa
- ret
- endp
Просмотров: 898 | Комментариев: 4
Метки: Assembler, генератор ПСЧ
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(24.05.2023 в 16:23):
Grey, цель рандома не просто нагенерить мусора, а чтобы на его основе нельзя было вычислить последовательность и, соответственно, предсказать следующий результат. Xn+1=A*Xn*(1-Xn), как мне кажется, такой уверенности не дает, чисто для бытовых нужд, запускать снежинки по экрану.
Grey
(24.05.2023 в 16:19):
Смотрел ролик про бифуркацию. Там в частности говорилось, что одно из применений - генератор псевдослучайных чисел. Xn+1=A*Xn*(1-Xn). Значение А принимается от 3,5 до 4. В экселе посмотрел, вроде похоже. Насколько это пригодно в жизни - трудно сказать.
ManHunter
(19.08.2021 в 14:21):
"Прогреть" генератор - не просто инициализировать его начальным значением, но и сразу же вхолостую сгенерировать стопицот чисел, чтобы избежать возможных коллизий на старте и максимально исказить рабочий буфер перед боевым применением генератора.
А где может пригодиться? Да где угодно, если там нужны случайные числа. Или реферат по программированию накатать.
А где может пригодиться? Да где угодно, если там нужны случайные числа. Или реферат по программированию накатать.
art2021
(19.08.2021 в 14:16):
Что значит "прогреть" генератор - если можно, то чуть поподробней.
И еще хотел спросить, а где и в каких случаях этот алгоритм может пригодится? Спасибо.
Добавить комментарий
Заполните форму для добавления комментария