Псевдослучайный детерминированный поток.

Тема в разделе "WASM.A&O", создана пользователем clone, 17 сен 2008.

  1. clone

    clone New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2006
    Сообщения:
    84
    Задача следующая: нужно генерировать псевдослучайный поток, который можно повторить с любой позиции. Фактически, каждый элемент (в моём случае -- dword) должен зависеть от seed и index и не зависеть от предыдущих элементов. Требование к потоку одно -- он должен выглядеть случайным. В данный момент делаю так:
    Код (Text):
    1. unsigned long stream_elem(unsigned long long index, unsigned long seed)
    2. {
    3.     return crc32(seed, (unsigned char *)&index, sizeof(index));
    4. }
    Чем заменить crc32, чтобы выиграть немного производительности, и не потерять "визуальной случайности"?
     
  2. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    так любой генератор псевдослучайных чисел на самом деле детерминированный ;) зависимость от предидущего числа вводится искусственно, чтобы не думать где брать индекс ;)
    в простейшем варианте
    Код (Text):
    1. imul    edx, [Rnd_tmp], 214011
    2. add     edx, 2531011
    3. mov     [Rnd_tmp], edx  ; <- та самая искусственная обратная сязь ;)
    4. mov     eax, Max_Rand   ; ограничение диапазоном (не обязательно)
    5. mul     edx
    6. mov     eax, edx    ; выход в eax
    замени Rnd_tmp на свой индекс, убери обратную связь и будет та-же псевдослучайность
     
  3. clone

    clone New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2006
    Сообщения:
    84
    Нет, не то. Без обратной связи получаются паттерны, если посмотреть на кусок сгенерированного стрима.
     
  4. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Любой хеш тебе подойдёт.
     
  5. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    clone
    Что-то я тебя не совсем понимаю - тебе нужна псевдослучайная последовательность, которую можно повторить с любого места? Тогда RND с обратной связью. А как только ты в [Rnd_tmp] поместишь определённое число (установка начального значения) то вся сгенрированная последовательность будет однозначно соответствовать этому числу, в любой момент останавливаешь генерацию, возвращаешь то-же начальное значение и получаешь ту-же псевдолучайную последовательность. Или нужно что-то другое?

    W4FhLF
    А чем принципиально (применительно к этой задаче) отличается хэш от приведённого выше RND? та же арифметика с переполнением, только операций намного больше.