C: окончательная правда о rand, random и arc4random

По этой теме много противоречивой информации. Итак, попробуем договориться об однозначном ответе:

Какой из этих генераторов случайных чисел в C создает лучшую случайность: rand, random или arc4random?

Примечание: чтобы прояснить вопрос, это не вопрос об истинной случайности, это просто столкновение между этими тремя.


Как уже указывалось, этот вопрос не имеет особого смысла, поскольку речь идет не о C, а о конкретной реализации, в моем случае, какао (в частности, iphone sdk, но я предполагаю, что они такие же, как и эти функции идут). Тем не менее, здесь есть полезная информация. В заключение я реализовал arc4random, в основном из-за его простоты использования (не требуется заполнение), что является важным фактором, на который никто не указал.

Я закрываю вопрос и добавляю тег какао для разработчиков какао, которые ищут информацию о ГСЧ. Большое спасибо тем, кто внес свой вклад, и извините за путаницу.

А как насчет семейства ГПСЧ drand48 ()? Моя оценка была бы «не входит в стандарт C», часть POSIX / SUS; обычно лучше, чем ранд; вероятно, не так хорош, как random () и его вспомогательные функции.

Jonathan Leffler 30.11.2008 19:07

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

jalf 30.11.2008 22:10

Ага, явно я напортачил. Его следовало ограничить до какао. И что теперь? Изменение объема вопроса сделает ответы неудобными. Но здесь есть полезная информация для разработчиков какао, и закрытие вопроса отправит все в подвешенное состояние. Что делать?

Steph Thirion 30.11.2008 23:22
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
11
3
13 538
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Реализация rand () не указана в стандарте C, однако большинство компиляторов используют линейный конгруэнтный генератор. random () и arc4random () также не являются стандартными для C, но они лучше, чем обычная реализация rand ()

Я бы сказал: arc4random () лучше, чем random (), лучше, чем rand ()

rand () действительно ужасен. Однако вы могли бы легко добиться большего, чем все три.

Это также зависит от того, для чего вам нужны случайные числа. Хороший генератор случайных чисел для шифрования / безопасности может не быть хорошим генератором случайных чисел для моделирования и наоборот.

"Я бы сказал...". Не могли бы вы объяснить почему?

osvein 20.04.2015 22:59
Ответ принят как подходящий

Из этих функций только rand является частью стандартного C. random является частью POSIX, а arc4random предоставляется только в BSD (и является производным). Так что только rand находится «в C».

Для rand стандарт C ничего не говорит о качестве генератора, т.е. возврат всегда одного и того же числа будет соответствовать. Он говорит, что число должно быть от 0 до RAND_MAX. Значение RAND_MAX и точный используемый алгоритм определяются реализацией (хотя RAND_MAX должен быть не менее 32767).

Для случайного POSIX указывает он должен иметь период не менее 2 ^ 31 по умолчанию, и, если initstate вызывается с 256 байтами состояния, тогда он должен иметь период не менее 2 ^ 69; другие детали снова определяются реализацией.

Для arc4random конкретная реализация является частью его определения (RC4). Уточнено, что он дает 2 ^ 32 разных значения; Я не мог найти ничего о его период.

Чтобы сравнить их в деталях, нужно знать, о какой конкретной реализации вы говорите.

привет Мартин, в моем случае реализация - это iphone SDK. Это действительно важно для этого вопроса? Стоит ли редактировать? Было бы лучше, если бы я мог избежать изменения объема вопроса.

Steph Thirion 30.11.2008 19:06

Если iphone SDK похож на OSX, то реализация rand () взята из FreeBSD (rand.c 1.15). Алгоритм взят от Паркера и Миллера: «Генераторы случайных чисел: трудно найти хорошие». random затем использует тот же алгоритм, если n в состоянии инициализации <8; ранд уже является хорошим алгоритмом

Martin v. Löwis 30.11.2008 20:16

Одинаков ли алгоритм arc4random во всех реализациях? Я читал здесь самое лучшее в какао: iphonedevelopment.blogspot.com/2008/10/…. Как он в целом сравнивается с двумя другими в большинстве реализаций? Может быть, мы сможем достичь консенсуса.

Steph Thirion 30.11.2008 23:27

Я думаю, что статья в блоге ошибочна. Он утверждает, что, поскольку arc4random производит 32 бита вместо 31, он дает «гораздо большую точность», но на самом деле он дает только один дополнительный бит. В типичном приложении вам даже не нужен 31 бит на вызов, а гораздо меньше. И rand, и arc4random достойны.

Martin v. Löwis 30.11.2008 23:49

@StephThirion @ Martinv.Löwis Я думаю, что здесь стоит отметить, что страница руководства Apple для rand(3) открывается полным отказом от rand в пользу arc4random. На странице руководства для random(3) делается вывод, что приложения, нуждающиеся в криптографически безопасной случайности, должны использовать arc4random.

justinpawela 11.08.2015 21:59

@ user2194039: Думаю, стоит отметить, что Мантин и Шамир доказали, что существует довольно надежный тест для определения RC4 как неслучайного. Таким образом, с 2001 года качество RC4 для генерации криптографически случайных чисел ставится под сомнение.

Martin v. Löwis 09.09.2015 01:14

В данном конкретном случае вызов RC4 кажется неуместным. Вопрос касался iOS, и документация iOS предостерегает от использования rand и random и рекомендует ARC4. Если Apple говорит: «arc4random - наш лучший», вряд ли разумно будет использовать их не самые лучшие только потому, что RC4 бросили вызов. Конечно, идеальным был бы какой-то другой вариант, но он не предлагается и в любом случае не актуален в контексте этого вопроса. В любом случае, мое замечание было задумано как информационное для всех, кто оказался здесь (как и я), а не как личная атака на ваш ответ.

justinpawela 09.09.2015 01:49

Другие вопросы по теме