OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Среда, 07 Январь, 2026 02:54

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 65 ]  На страницу Пред.  1, 2, 3, 4
Автор Сообщение
СообщениеДобавлено: Суббота, 03 Январь, 2026 02:52 

Зарегистрирован: Среда, 01 Август, 2007 00:13
Сообщения: 197
arisu писал(а):
. в отличие от pcg32

Мне в PCG кажется загадочным переменный инкремент вместо жёстко зашитого в коде. Насколько я знаю, автор PCG таким образом пыталась сделать потоки, но это всё достаточно хлипко. Более строгий переход - это функции перехода, дающие доказанно неперекрывающиеся последовательности.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 03 Январь, 2026 02:59 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1618
я признаюсь, что в статьи Мелиссы О'Нил не вникал (давайте сделаем вид, что я это могу), просто поверил ей на слово, что это хороший генератор. вроде как до сих пор никаких особых проблем в нём не нашли, а для крипто я его, понятно, использовать не собираюсь — для этого у меня ISAAC есть (просто потому что мне нравится Боб Дженкинс).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 05 Январь, 2026 15:29 

Зарегистрирован: Среда, 01 Август, 2007 00:13
Сообщения: 197
arisu писал(а):
просто поверил ей на слово, что это хороший генератор.

Для некриптографических целей у него хорошее качество, но вот использование в многопоточном режиме вызывает вопросы. Для многопоточности нужны всё же математические гарантии.

Кстати, на систему типов Оберона ещё хорошо ложатся LFSR/GFSR, единственная проблема - это скремблеры, т.е. выходные функции, они обычно сделаны для языков с целочисленным переполнением. Но если адаптировать скремблер AOX из ссылки [1] и классический генератор xoshiro128 из [2], то получается даже проще и быстрее моей модификации XKISS. Тестовое значение я взял из выдачи реализации на C99, проходящей TestU01, SmokeRand и PractRand (по меньшей мере до 8 ТиБ). AOX слабее ++ или **, но для большинства целей годится. Матрицу перехода для многопоточности можно взять из [2], мне ее лень было переписывать и тестировать:

Код:
(**
 * 1. https://doi.org/10.1109/TC.2022.3204226
 * 2. https://prng.di.unimi.it/
 *)
MODULE xoshiro128aox;
IMPORT SYSTEM, Out;


TYPE Xoshiro128AoxState = RECORD
    s : ARRAY 4 OF INTEGER;
END;


PROCEDURE Xoshiro128AoxInit(VAR obj : Xoshiro128AoxState;
                            s : ARRAY OF INTEGER);
VAR
    i : INTEGER;
BEGIN
    FOR i := 0 TO 3 DO
        obj.s[i] := s[i]
    END;
    IF (obj.s[0] = 0) & (obj.s[1] = 0) & (obj.s[2] = 0) & (obj.s[3] = 0) THEN
        obj.s[0] := 12345678; obj.s[1] := 87654321;
        obj.s[2] := 22222222; obj.s[3] := 33333333
    END
END Xoshiro128AoxInit;

PROCEDURE BitXor(a, b : INTEGER) : INTEGER;
BEGIN
    RETURN SYSTEM.VAL(INTEGER, SYSTEM.VAL(SET, a) / SYSTEM.VAL(SET, b))
END BitXor;

PROCEDURE BitAnd(a, b : INTEGER) : INTEGER;
BEGIN
    RETURN SYSTEM.VAL(INTEGER, SYSTEM.VAL(SET, a) * SYSTEM.VAL(SET, b))
END BitAnd;

PROCEDURE BitOr(a, b : INTEGER) : INTEGER;
BEGIN
    RETURN SYSTEM.VAL(INTEGER, SYSTEM.VAL(SET, a) + SYSTEM.VAL(SET, b))
END BitOr;

PROCEDURE Xoshiro128AoxNext(VAR obj : Xoshiro128AoxState) : INTEGER;
VAR   
    sx, sa, out, t: INTEGER;
BEGIN
    sx := BitXor(obj.s[0], obj.s[1]); sa := BitAnd(obj.s[0], obj.s[1]);
    out := BitAnd(07FFFFFFFH, BitXor(sx, BitOr(ROR(sa, 31), ROR(sa, 30))));
    t := LSL(obj.s[1], 9);
    obj.s[2] := BitXor(obj.s[2], obj.s[0]);
    obj.s[3] := BitXor(obj.s[3], obj.s[1]);
    obj.s[1] := BitXor(obj.s[1], obj.s[2]);
    obj.s[0] := BitXor(obj.s[0], obj.s[3]);
    obj.s[2] := BitXor(obj.s[2], t);
    obj.s[3] := ROR(obj.s[3], 21);
    RETURN out
END Xoshiro128AoxNext;


PROCEDURE Xoshiro128AoxTest() : BOOLEAN;
CONST
    uref = 0648D78B0H;
VAR
    prng : Xoshiro128AoxState;
    s : ARRAY 4 OF INTEGER;
    i, u : INTEGER;
BEGIN
    s[0] := 12345678; s[1] := 87654321; s[2] := 2; s[3] := 5;
    u := 0;
    Xoshiro128AoxInit(prng, s);
    FOR i := 1 TO 100000 DO
        u := Xoshiro128AoxNext(prng)
    END;
    Out.String("Output:    "); Out.Int(u, 10); Out.Ln();
    Out.String("Reference: "); Out.Int(uref, 10); Out.Ln();
    FOR i := 1 TO 10 DO
        Out.Int(Xoshiro128AoxNext(prng), 5);
        Out.Ln()
    END;
    RETURN u = uref
END Xoshiro128AoxTest;


BEGIN
    IF Xoshiro128AoxTest() THEN Out.String("Passed"); Out.Ln()
    ELSE                        Out.String("Failed"); Out.Ln()
    END
END xoshiro128aox.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 05 Январь, 2026 20:39 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1618
ScrollLock писал(а):
Для некриптографических целей у него хорошее качество, но вот использование в многопоточном режиме вызывает вопросы. Для многопоточности нужны всё же математические гарантии.
вроде бы сама доктор О'Нил где-то писала, что потоки — это так, побочная приколюха для бедных, без особых гарантий, зато дёшево. я никогда этой фичей не пользовался, например — зачем? то есть, всё равно надо две копии состояния держать — а тогда не проще ли просто их засидироать разным?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 06 Январь, 2026 11:07 

Зарегистрирован: Среда, 01 Август, 2007 00:13
Сообщения: 197
arisu писал(а):
то есть, всё равно надо две копии состояния держать — а тогда не проще ли просто их засидироать разным?

В случае сидирования и потоков в PCG могут быть неочевидные нюансы: https://pcg.di.unimi.it/pcg.php. Для сидирования простыми 1,2,3,4,5.... функция перехода там слишком простая, а для сидирования случайными значениями у PCG32 слишком короткий период, всего 2^64. У xoshiro128aox (а также ++ и **) период ощутимо больше, и даже до применения выходной функции там нет младших бит с малым периодом.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 65 ]  На страницу Пред.  1, 2, 3, 4

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2026, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB