Генерируйте криптографически безопасные случайные числа в php

Если вам приходится сравнивать исходную строку чаще с другими строками, одним из элегантных решений является использование регулярных выражений.

std::wstring first = L"Test";
std::wstring second = L"TEST";

std::wregex pattern(first, std::wregex::icase);
bool isEqual = std::regex_match(second, pattern);
17
задан Salvador Dali 16 July 2015 в 01:04
поделиться

9 ответов

Генераторы псевдослучайных чисел (ГПСЧ) - очень сложный зверь.

Настоящих «идеальных» генераторов случайных чисел не существует - фактически лучшее, что можно сделать с помощью математических функций являются псевдослучайными - они кажутся достаточно случайными для большинства намерений и целей.

Фактически, выполнение каких-либо дополнительных действий с числом, возвращаемым ГПСЧ, на самом деле не увеличивает его случайность, и фактически число может стать менее случайным.

Итак, мой лучший совет: не возитесь со значениями, возвращаемыми из ГПСЧ. Используйте PRNG, который достаточно хорош для предполагаемого использования, а если это не так, тогда найдите PRNG, который может дать лучшие результаты, если необходимо.

И, честно говоря, похоже, что функция mt_rand использует Твистер Мерсенна , который сам по себе является довольно хорошим ГПСЧ, так что s, вероятно, будет достаточно хорош для повседневного использования.

Однако Mersenne Twister не предназначен для использования в каких-либо контекстах безопасности . См. этот ответ для решения, которое можно использовать, когда вам нужна случайность для обеспечения безопасности.

Редактировать

В комментариях был вопрос, почему выполнение операций со случайным числом может сделать его менее случайным. Например, некоторые ГПСЧ могут возвращать более согласованные, менее случайные числа в разных частях битов - верхний предел может быть более случайным, чем нижний.

Следовательно, в операциях, в которых отбрасывается верхний предел, и возвращается нижний предел, значение может стать менее случайным, чем исходное значение, возвращаемое из ГПСЧ.

Я не могу найти хорошего объяснения в данный момент, но я основал это из документации Java для Random.nextInt (int) метод, который предназначен для создания довольно случайного значения в указанном диапазоне. Этот метод учитывает разницу в случайности частей значения, поэтому он может возвращать лучшее случайное число по сравнению с более простыми реализациями, такими как rand ()% range .

33
ответ дан 30 November 2019 в 09:57
поделиться

Невозможно сгенерировать истинные случайные числа, лучшее, на что вы можете надеяться, - это псевдослучайное, что и обеспечивает rand (), ваша функция не ближе к random, чем rand (). Взгляните на этот http://en.wikipedia.org/wiki/Random_number_generator

-1
ответ дан 30 November 2019 в 09:57
поделиться

Если вам не нравится встроенный PHP в rand () , вам, вероятно, также не следует использовать их встроенный shuffle () , поскольку он, похоже, построен на их rand () .

Я наполовину уверен, что «отраслевым стандартом» теперь является перемешивание Фишера-Йейтса .

1
ответ дан 30 November 2019 в 09:57
поделиться

Не существует такого понятия, как "идеальное" случайное число. Неважно, какое у вас субъективное определение понятия «идеальный». Вы можете добиться только псевдослучайности.

Я просто пытался указать вам в правильном направлении. Вы задали вопрос об идеальных случайных числах, даже если они были заключены в кавычки. И да, вы можете улучшить случайность. Вы даже можете реализовать эвристические или «естественные» алгоритмы, такие как «атмосферный шум» - но все же вы не идеальны, ни в коем случае.

1
ответ дан 30 November 2019 в 09:57
поделиться

Все зависит от того, зачем вам это случайное число :) Для меня ShuffleBag самый лучший :)

2
ответ дан 30 November 2019 в 09:57
поделиться
<?php
  function random_number(){
      return 4; // return generated number
                // guaranteed to be random
  }
  ?>

Если не считать шуток, вы попадаете в философский вопрос о том, что является «случайным», а что «лучшим». В идеале вы бы хотели, чтобы в ваших случайных числах было несколько шаблонов в течение вашей процедуры. Обычно системное время используется в качестве начального числа, но я также использовал предыдущее случайное число как начальное число, предыдущее случайное число назад как начальное. Проблема в том, что с достаточно мощным компьютером и полным знанием работающего оборудования и функций генератора вы сможете предсказать весь набор сгенерированных чисел. Таким образом, если бы у вас был достаточно мощный компьютер (некоторые люди относят Бога к этой категории), который знал все возможные переменные и функции Вселенной, вы могли бы предсказать каждое событие, которое произошло или произойдет.

12
ответ дан 30 November 2019 в 09:57
поделиться

Я не уверен, что то, что вы сделали, "улучшает" случайность. Насколько я понимаю, вы генерируете 100 случайных чисел, а затем случайным образом выбираете одно из них.

Судя по тому, что я помню из своего курса вероятностей, это, вероятно, не увеличивает случайность, как если бы в генераторе есть основная ошибка функция (mt_rand ()), то она все равно будет каким-то образом отражена в выводе.

17
ответ дан 30 November 2019 в 09:57
поделиться

Чем mt_rand () "плохой"?

Например: если он поддерживает определенное число. Допустим, mt_rand (1, 10) предпочитает низкие числа в диапазоне, то есть «1» и «2» встречаются в среднем более 10% каждое. Тогда ваше «улучшение» все равно будет страдать от той же проблемы.

Выбор случайного числа из ошибочной последовательности все равно будет ошибочным.

13
ответ дан 30 November 2019 в 09:57
поделиться

Изменить: мой комментарий больше не действителен. См. Следующий ответ: https://stackoverflow.com/a/31443898/109561


Я предполагаю, что вы беспокоитесь о распределении mt_rand (). Я протестировал его, и он очень уровень, и обе границы включены.

2
ответ дан 30 November 2019 в 09:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: