На языке C, какова разница в скорости между Call Rand() и RdRand?

После моего предыдущего вопроса «На каком алгоритме основан Rand() в Язык C?"", причина, по которой я хочу знать алгоритм функции, заключается в том, что я хочу сравнить разницу в скорости между ним и RdRand.

Я пытался зациклить его 100 миллионов раз и рассчитать время его работы.

Обычно использование аппаратных средств для создания случайных чисел (RdRand) значительно увеличивает его скорость, но результат показывает обратное (Rand() 3 с против RdRand 10 с).

Может ли кто-нибудь помочь мне понять это?

Бесконечно благодарен!


person Kudos    schedule 13.05.2015    source источник
comment
Почему RdRand должен быть быстрее, если он криптографически силен, а Rand — это простое вычисление LCG?   -  person Thilo    schedule 13.05.2015
comment
Я не уверен, является ли это обманом или нет, но похоже, что в любом случае вам будет интересна информация: stackoverflow.com/questions/26771329/   -  person Michael Burr    schedule 13.05.2015
comment
Вот еще несколько обсуждений производительности RDRAND: bridge?rq=1" title="Какова задержка и пропускная способность инструкции rdrand на мосту ivy"> stackoverflow.com/questions/10484164/   -  person Thilo    schedule 13.05.2015
comment
Историческая версия rand() — это очень плохой линейный конгруэнтный генератор, в котором младшие биты особенно далеки от случайных. Но это очень быстро: просто умножение целых чисел, сложение и маскирование битов. Обычно достаточно для игр. В противном случае не используйте его. Некоторый контекст есть на man7.org/linux/man-pages/man3. /rand.3.html. Любой rng криптографического качества, вероятно, немного медленнее, чем rand, просто потому, что он выполняет гораздо больше работы по скремблированию битов.   -  person Gene    schedule 13.05.2015


Ответы (1)


Аппаратные методы не всегда быстрее программных.

Возможно, вам будет интересно посмотреть здесь, это грех glibc функция по сравнению с инструкцией Intel fsin, которая в большинстве случаев более точна и быстрее.

Также каждая реализация имеет свои плюсы и минусы. Основная задача RdRand:

Генератор случайных чисел соответствует стандартам безопасности и криптографии, таким как NIST SP 800-90A,[4] FIPS 140-2 и ANSI X9.82. --- RdRand, Википедия

Таким образом, вы можете использовать RdRand и быть уверенным в его безопасности, в то время как если вам нужна быстрая случайная генерация, а безопасность не имеет значения. Вы можете просто использовать функцию glibc rand().

person mdh.heydari    schedule 13.05.2015
comment
Безопасность — не единственная причина, по которой вам нужен высококачественный генератор случайных чисел. Другими примерами использования являются получение хорошего распределения бросков костей в игре или источник джиттера в симуляции отжига. - person MooseBoys; 13.05.2015
comment
Отличие ГСЧ в том, что его поведение трудно предсказать и оно называется безопасным (более формальное объяснение здесь) и распределение ГСЧ. Распределение вероятностей rand() однородно, и из него легко сделать другие распределения (Посмотрите здесь). - person mdh.heydari; 13.05.2015
comment
Возвращение последовательности {0,1,2,3,4,...,2^32-1} также является равномерным распределением, но это был бы ужасный генератор. rand не так уж и плохо, но и не здорово. glibc особенно плох, поскольку (согласно Википедии) он выставляет младшие биты сгенерированных значений, которые имеют особенно плохие свойства. - person MooseBoys; 13.05.2015
comment
Да, это не идеально, но достаточно хорошо для решения многих проблем, и это правильно, что это плохо для многих проблем, таких как безопасность или проблемы, в которых критично качество случайности. Также спасибо за обсуждение! :) Это заставило меня прочитать много вещей, которых я раньше не знал! - person mdh.heydari; 13.05.2015