c ++: самый быстрый способ заполнить буфер случайными байтами - PullRequest
18 голосов
/ 15 сентября 2011

У меня есть этот большой массив символов, который должен заполняться случайными байтами в высокой частоте.Интересно, есть ли какой-нибудь более быстрый способ, кроме наивного (используя цикл for - заполнить каждую ячейку случайным байтом), чтобы сделать это.Нет никаких требований к случайному качеству значений.Подойдет любой «случайный» мусор.Платформа оконная

Ответы [ 8 ]

18 голосов
/ 15 сентября 2011

True random (только для Unix):

int fd = open("/dev/random", O_RDONLY);
read(fd, your_buffer, buffer_size);

Не полностью случайный (только для Unix):

int fd = open("/dev/urandom", O_RDONLY);
read(fd, your_buffer, buffer_size);

Постоянный случайный (если вы не используете srand(time(NULL)), переносимый):

for(size_t i = 0; i < buffer_size; i++)
    your_buffer[i] = rand() % 256;

Или что-то вроде:

memcpy(your_buffer, (void*)memcpy, buffer_size);
3 голосов
/ 15 сентября 2011

Зависит от того, используете ли вы Linux или Windows, но в Linux выполнение memcpy из / dev / random должно работать.

В Windows вы можете использовать CryptGenRandom для заполнения буфера случайными данными: http://msdn.microsoft.com/en-us/library/aa379942.aspx. По-видимому, это эквивалент Windows для чтения данных из / dev / random. Python использует его для реализации своей функции OS.urandom в Windows: http://en.wikipedia.org/wiki/CryptGenRandom

1 голос
/ 15 сентября 2011

Вы, вероятно, могли бы сделать что-то вроде, если бы размер вашего буфера можно было разделить на 4.

unsigned int v = rand(), *ptr = (unsigned int *)buf;
for(int i = 0; i < buffer_size / 4; i++)
    ptr[i] = (v << 16) ^ rand();

Просто идея;)

0 голосов
/ 01 марта 2013

Я написал библиотеку, которая создает «почти случайные» буферы: используя несколько буферов, заполненных псевдослучайными случайными данными, библиотека случайным образом выбирает буфер и возвращает его в приложение.

Эта библиотека была разработанаво-первых, чтобы быть максимально быстрым, учитывая низкое потребление памяти и высокую пропускную способность.

Он может использоваться для обработки на основе блоков: полученные данные не являются действительно случайными, но способ представления буферов в приложенииТаким образом, он генерирует случайный поток, который может быть достаточно большим, чтобы победить какой-либо алгоритм сжатия.

Вы можете найти его по адресу: https://gitorious.org/randbuf/

0 голосов
/ 15 сентября 2011

Поскольку этот вопрос помечен как windows / winapi, вы можете использовать CryptGenRandom .

0 голосов
/ 15 сентября 2011

Установить буфер с ненужными значениями впереди. Если вам нужно снова заполнить массив char случайными байтами, просто запишите части memcpy из мусорного буфера со случайным смещением в массив char, пока он не будет полностью перезаписан. memcpy обычно очень быстр и оптимизирован для использования SIMD и инструкций кеша. Если вы копируете сегменты, достаточно большие, то издержки на выбор случайных смещений, если они незначительны, - вы генерируете ненужные данные со скоростью memcpy.

0 голосов
/ 15 сентября 2011

Это похоже на то, что вам нужно:

srandom(42);
memset(ptr, random(), len);

Генерируется только одно случайное число, но данные будут "случайными" достаточно, чтобы вы могли обнаружить много ошибок на основе неинициализированной памяти.Вы можете изменить начальное число и перезапустить программу для тестирования с другими данными.

Если вам это нужно для отладки, вы также можете взглянуть на Valgrind .

0 голосов
/ 15 сентября 2011

Очень быстрый и простой способ генерации большого массива равномерно распределенных случайных чисел - использовать Mersenne twister . Если скорость критична, это можно сделать даже с помощью SIMD.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...