Задача следующая: нужно генерировать псевдослучайный поток, который можно повторить с любой позиции. Фактически, каждый элемент (в моём случае -- dword) должен зависеть от seed и index и не зависеть от предыдущих элементов. Требование к потоку одно -- он должен выглядеть случайным. В данный момент делаю так: Код (Text): unsigned long stream_elem(unsigned long long index, unsigned long seed) { return crc32(seed, (unsigned char *)&index, sizeof(index)); } Чем заменить crc32, чтобы выиграть немного производительности, и не потерять "визуальной случайности"?
так любой генератор псевдослучайных чисел на самом деле детерминированный зависимость от предидущего числа вводится искусственно, чтобы не думать где брать индекс в простейшем варианте Код (Text): imul edx, [Rnd_tmp], 214011 add edx, 2531011 mov [Rnd_tmp], edx ; <- та самая искусственная обратная сязь ;) mov eax, Max_Rand ; ограничение диапазоном (не обязательно) mul edx mov eax, edx ; выход в eax замени Rnd_tmp на свой индекс, убери обратную связь и будет та-же псевдослучайность
Нет, не то. Без обратной связи получаются паттерны, если посмотреть на кусок сгенерированного стрима.
clone Что-то я тебя не совсем понимаю - тебе нужна псевдослучайная последовательность, которую можно повторить с любого места? Тогда RND с обратной связью. А как только ты в [Rnd_tmp] поместишь определённое число (установка начального значения) то вся сгенрированная последовательность будет однозначно соответствовать этому числу, в любой момент останавливаешь генерацию, возвращаешь то-же начальное значение и получаешь ту-же псевдолучайную последовательность. Или нужно что-то другое? W4FhLF А чем принципиально (применительно к этой задаче) отличается хэш от приведённого выше RND? та же арифметика с переполнением, только операций намного больше.