По этой теме много противоречивой информации. Итак, попробуем договориться об однозначном ответе:
Какой из этих генераторов случайных чисел в C создает лучшую случайность: rand, random или arc4random?
Примечание: чтобы прояснить вопрос, это не вопрос об истинной случайности, это просто столкновение между этими тремя.
Как уже указывалось, этот вопрос не имеет особого смысла, поскольку речь идет не о C, а о конкретной реализации, в моем случае, какао (в частности, iphone sdk, но я предполагаю, что они такие же, как и эти функции идут). Тем не менее, здесь есть полезная информация. В заключение я реализовал arc4random, в основном из-за его простоты использования (не требуется заполнение), что является важным фактором, на который никто не указал.
Я закрываю вопрос и добавляю тег какао для разработчиков какао, которые ищут информацию о ГСЧ. Большое спасибо тем, кто внес свой вклад, и извините за путаницу.
Вопрос не имеет смысла. Только rand () является частью языка C, и в стандарте ничего не говорится о том, насколько он должен быть случайным или как его следует реализовать.
Ага, явно я напортачил. Его следовало ограничить до какао. И что теперь? Изменение объема вопроса сделает ответы неудобными. Но здесь есть полезная информация для разработчиков какао, и закрытие вопроса отправит все в подвешенное состояние. Что делать?





Реализация rand () не указана в стандарте C, однако большинство компиляторов используют линейный конгруэнтный генератор. random () и arc4random () также не являются стандартными для C, но они лучше, чем обычная реализация rand ()
Я бы сказал: arc4random () лучше, чем random (), лучше, чем rand ()
rand () действительно ужасен. Однако вы могли бы легко добиться большего, чем все три.
Это также зависит от того, для чего вам нужны случайные числа. Хороший генератор случайных чисел для шифрования / безопасности может не быть хорошим генератором случайных чисел для моделирования и наоборот.
"Я бы сказал...". Не могли бы вы объяснить почему?
Из этих функций только 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. Это действительно важно для этого вопроса? Стоит ли редактировать? Было бы лучше, если бы я мог избежать изменения объема вопроса.
Если iphone SDK похож на OSX, то реализация rand () взята из FreeBSD (rand.c 1.15). Алгоритм взят от Паркера и Миллера: «Генераторы случайных чисел: трудно найти хорошие». random затем использует тот же алгоритм, если n в состоянии инициализации <8; ранд уже является хорошим алгоритмом
Одинаков ли алгоритм arc4random во всех реализациях? Я читал здесь самое лучшее в какао: iphonedevelopment.blogspot.com/2008/10/…. Как он в целом сравнивается с двумя другими в большинстве реализаций? Может быть, мы сможем достичь консенсуса.
Я думаю, что статья в блоге ошибочна. Он утверждает, что, поскольку arc4random производит 32 бита вместо 31, он дает «гораздо большую точность», но на самом деле он дает только один дополнительный бит. В типичном приложении вам даже не нужен 31 бит на вызов, а гораздо меньше. И rand, и arc4random достойны.
@StephThirion @ Martinv.Löwis Я думаю, что здесь стоит отметить, что страница руководства Apple для rand(3) открывается полным отказом от rand в пользу arc4random. На странице руководства для random(3) делается вывод, что приложения, нуждающиеся в криптографически безопасной случайности, должны использовать arc4random.
@ user2194039: Думаю, стоит отметить, что Мантин и Шамир доказали, что существует довольно надежный тест для определения RC4 как неслучайного. Таким образом, с 2001 года качество RC4 для генерации криптографически случайных чисел ставится под сомнение.
В данном конкретном случае вызов RC4 кажется неуместным. Вопрос касался iOS, и документация iOS предостерегает от использования rand и random и рекомендует ARC4. Если Apple говорит: «arc4random - наш лучший», вряд ли разумно будет использовать их не самые лучшие только потому, что RC4 бросили вызов. Конечно, идеальным был бы какой-то другой вариант, но он не предлагается и в любом случае не актуален в контексте этого вопроса. В любом случае, мое замечание было задумано как информационное для всех, кто оказался здесь (как и я), а не как личная атака на ваш ответ.
А как насчет семейства ГПСЧ drand48 ()? Моя оценка была бы «не входит в стандарт C», часть POSIX / SUS; обычно лучше, чем ранд; вероятно, не так хорош, как random () и его вспомогательные функции.