Получение случайных элементов с помощью PHP


Заполнить массив случайными числами

01.08.2012, 12:12

Создать массив, заполнить случайными числами четные элементы массива, а нечетные заполнить квадратом их индекса
На паре задали сделать работу,но ничего не объяснили,а я до этого с массивами не работал,если кому.

Заполнить случайные элементы массива случайными числами
На паре задали сделать работу,но ничего не объяснили,а я до этого с массивами не работал,если кому.

Заполнить два массива случайного размера случайными числами и сравнить их
На паре задали сделать работу,но ничего не объяснили,а я до этого с массивами не работал,если кому.

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

Заполнить третий массив теми числами, которые входят и в первый и во второй массив
Помогите сделать задачу с использованием массива. Заполнить два массива размером 20 и 30.

Получение случайных элементов с помощью PHP

Освойте бесплатно наиболее простой, быстрый и гибкий способ создавать адаптивные веб-сайты.

Дизайн лендинга

Создавайте дизайн любых сайтов — для себя и на заказ!

Популярное

  • Главная
  • ->
  • Материалы
  • ->
  • Генерация случайных строк в PHP

Reg.ru: домены и хостинг

Крупнейший регистратор и хостинг-провайдер в России.


Более 2 миллионов доменных имен на обслуживании.

Продвижение, почта для домена, решения для бизнеса.

Более 700 тыс. клиентов по всему миру уже сделали свой выбор.

Бесплатный Курс «Практика HTML5 и CSS3»

Освойте бесплатно пошаговый видеокурс

по основам адаптивной верстки

на HTML5 и CSS3 с полного нуля.

Фреймворк Bootstrap: быстрая адаптивная вёрстка

Пошаговый видеокурс по основам адаптивной верстки в фреймворке Bootstrap.

Научитесь верстать просто, быстро и качественно, используя мощный и практичный инструмент.

Верстайте на заказ и получайте деньги.

Что нужно знать для создания PHP-сайтов?

Ответ здесь. Только самое важное и полезное для начинающего веб-разработчика.

Узнайте, как создавать качественные сайты на PHP всего за 2 часа и 27 минут!

Создайте свой сайт за 3 часа и 30 минут.

После просмотра данного видеокурса у Вас на компьютере будет готовый к использованию сайт, который Вы сделали сами.

Вам останется лишь наполнить его нужной информацией и изменить дизайн (по желанию).

Изучите основы HTML и CSS менее чем за 4 часа.

После просмотра данного видеокурса Вы перестанете с ужасом смотреть на HTML-код и будете понимать, как он работает.

Вы сможете создать свои первые HTML-страницы и придать им нужный вид с помощью CSS.


Бесплатный курс «Сайт на WordPress»

Хотите освоить CMS WordPress?

Получите уроки по дизайну и верстке сайта на WordPress.

Научитесь работать с темами и нарезать макет.

Бесплатный видеокурс по рисованию дизайна сайта, его верстке и установке на CMS WordPress!

Хотите изучить JavaScript, но не знаете, как подступиться?

После прохождения видеокурса Вы освоите базовые моменты работы с JavaScript.

Развеются мифы о сложности работы с этим языком, и Вы будете готовы изучать JavaScript на более серьезном уровне.

*Наведите курсор мыши для приостановки прокрутки.

Генерация случайных строк в PHP

В этой небольшой заметке я покажу, как можно сгенерировать случайную строку средствами PHP.

Подобная задача может возникнуть в самых разных ситуациях, например:

— создание случайного пароля из предустановленного набора символов;

— генерация случайного имени для файла или папки (в целях их скрытия и защиты);

— создание временного уникального идентификатора для какого-либо процесса;

— использование случайной строки в качестве «исходного материала» для более сложного скрипта и т.д.

При творческом подходе можно найти и другие сферы применения случайных строк.

В PHP нет специальной функции, которая выполняла бы интересующую нас задачу, поэтому такой инструмент нужно писать самому под свои нужды.

Ниже привожу один из вариантов решения этой задачи.

Поскольку материал рассчитан на новичков, сделаю пояснения по работе данной функции.


Сама функция генерации случайной строки принимает два параметра. Первый — количество символов, которое мы хотим видеть в результирующей строке. Второй — непосредственно массив символов, которые мы хотим использовать при генерации.

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

Если первый параметр корректный, то мы подсчитываем количество символов, участвующих в формировании строки с помощью функции count() и вычитаем из получившегося числа единицу. Для чего мы это делаем? На этот вопрос я отвечу чуть позже, а пока идем дальше по функции.

Объявив переменную $string для хранения итогового результата, мы приступаем к формированию случайной строки в цикле for.

В качестве начального значения счетчика $i цикла выступает количество символов, которое мы хотим увидеть в случайной строке ($str_length).

Затем идет условие, что цикл должен выполняться до тех пор, пока значение счетчика больше нуля.

Наконец, после каждой итерации цикла мы уменьшаем значение счетчика на единицу с помощью оператора декремента «—«.

Таким образом, в цикле будет совершено столько итераций, сколько символов мы хотим получить в итоговой строке.

Ну а теперь посмотрим на тело цикла и вернемся к вопросу о том, для чего мы вычитали единицу из общего количества символов в переменной $str_characters.

Как вы видите, итоговую строку мы формируем, последовательно добавляя к переменной $string по одному символу за каждый проход по циклу.

Давайте посмотрим детальнее.

Мы используем функцию mt_rand() и передаем ей два параметра — ноль и ту самую уменьшенную на единицу переменную $characters_length. Функция mt_rand() позволяет нам просто сгенерировать случайное число в заданном диапазоне (т.е. от нуля до $characters_length).

Смысл использования этой функции в том, что с ее помощью мы создаем случайное число, которое используется как индекс для массива $str_characters.

Индекс указывает на то, какой именно символ из массива $str_characters мы хотим получить.

Вот мы и подошли к ключевому моменту. Если бы первый элемент мы получали с помощью конструкции вида

то тогда последний элемент можно было бы получить, написав следующее (ведь в массиве у нас 62 элемента):

Это было бы вполне логично, но, к сожалению, неверно.

В действительности первый элемент доступен через

а 62 элемент (последний) через

Вы можете убедиться в этом просто выведя на экран данные значения.


Теперь становится совершенно понятно, для чего мы вычитали из 62 единицу. Только лишь для того, чтобы диапазон наших индексов был от 0 до 61. Именно это обеспечит нам корректное формирование случайной строки без вероятности случайно обратиться к несуществующему элементу с индексом 62.

Вот и все. Возвращаем значение с помощью оператора return — и наша функция готова.

Осталось вызвать ее и передать в качестве параметра желаемое количество символов в нашей случайной строке, например так:

В результате мы получим нечто совершенно бессвязное, вроде:

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

Разумеется, наша функция универсальна и прекрасно работает также с русским языком. В коде выше вы можете увидеть еще один вариант массива $str_characters (он закомментирован), который содержит кириллические символы.

Для того, чтобы в этом убедиться, мы можем закомментировать первый массив $str_characters (с латинскими символами) и раскомментировать второй.

Теперь, если мы обновим страницу, то получим что-то вроде:

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

И напоследок одно замечание, которое может быть полезно.

Уверен, что вы, как пользователь, встречались со случайно сгенерированными паролями, в которых едва ли можно понять, что что же это за символ:

— то ли маленькая буква «l», то ли цифра «1»;
— то ли русская «с», то ли английская «c»;
— то ли русская «у», то ли английская «y»;
— то ли ноль, то ли буква «о» (опять-таки, русская или английская);
— и т.д.

Мастер Йода рекомендует:  Создание Meta-тегов

Поэтому, если вы сами генерируете какую-то строку для других пользователей, стоит позаботиться о том, чтобы она точно была им понятна. Представьте, что вы оказались на месте другого человека и гадаете: «Что же это такое?», «Буква это или цифра, черт возьми?»

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

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

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

С уважением, Дмитрий Науменко

Понравился материал и хотите отблагодарить?
Просто поделитесь с друзьями и коллегами!

Случайный элемент массива (JavaScript)

Получить случайный элемент массива в JavaScript можно при помощи значения количества его элементов и функций Math.random() и Math.floor().

Случайное значение


Ниже простой пример получения случайного значения массива.

Функция arrayRandElement

Проще определить отдельную функцию arrayRandElement(arr) для получения случайного элемента массива, которая будет принимать в качестве параметра один параметр — массив, и возвращать его случайное значение.

Как в PHP выбрать случайное значение из массива

PunBB.INFO → PHP / SQL → Как в PHP выбрать случайное значение из массива

You must login or register to post a reply

Posts: 3

1 Topic by PunBB 2020.04.25 02:35

  • PunBB
  • Admin
  • Offline
  • More info

    Topic: Как в PHP выбрать случайное значение из массива

    При помощи данной функции мы можем выбрать случайный элемент (или элементы) массива. Да, именно элемент или элементы! Это может быть один элемент или их может быть несколько. Все зависит от той задачи, которая перед Вами стоит.

    Однако, здесь следует учесть, что функция будет возвращать не значение элемента, а его ключ (или ключи, если элементов несколько).

    В качестве параметров в скобках функция принимает: имя массива, с которым работаем и число элементов, которые необходимо выбрать.

    В общем-то все просто! А еще проще будет, когда мы все это рассмотрим на примерах.


    Давайте для начала будем выбирать один-единственный случайный элемент из массива.

    2 Reply by PunBB 2020.04.25 02:38

    • PunBB
    • Admin
    • Offline
    • More info

      Re: Как в PHP выбрать случайное значение из массива

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

      Как Вы, наверное, догадались, наиболее простой способ это реализовать – это поместить все имеющиеся цитаты-изречения в массив, а потом выбирать из этого массива случайный элемент и выводить его на экран.

      Чем больше у Вас будет цитат в массиве, тем меньшая вероятность их повторения.

      Но для примера я сильно заморачиваться не буду и помещу в мой массив 7 изречений.

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

      Как я уже говорила, функция возвращает не значение элемента, а его ключ (или номер в списке). Таким образом, в переменной будет сохранен ключ случайного элемента.

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

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

      Здесь в вывод на экран я еще добавила немного стилей прям в тег заголовка. Это не обязательно и лучше стили задавать через файл таблицы стилей, но для такого простого примера я его создавать не стала.

      Как создать случайную строку с помощью PHP?


      Я знаю, что функция rand в PHP генерирует случайные целые числа, но как лучше всего создать случайную строку, например:

      Исходная строка, 9 символов

      Пример произвольной строки с ограничением до 6 символов

      ОБНОВЛЕНИЕ: я нашел тонны этих типов функций, в основном я пытаюсь понять логику каждого шага.

      ОБНОВЛЕНИЕ: функция должна генерировать любое количество символов по мере необходимости.

      Пожалуйста, прокомментируйте детали, если ответите.

      17 ответов

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

      Чтобы вызвать эту функцию с данными вашего примера, вы должны назвать ее примерно так:

      Обратите внимание, что эта функция не проверяет уникальность переданных ей допустимых символов. Например, если вы вызываете его с допустимой строкой символов в виде ‘AAAB’ , вероятность выбора буквы A для каждой буквы будет в три раза выше. как B. Это можно считать ошибкой или функцией, в зависимости от ваших потребностей.

      Если вы хотите разрешить повторяющиеся вхождения символов, вы можете использовать эту функцию:

      Основной алгоритм заключается в создании умноженное на случайное число от 0 до — 1 мы используем в качестве индекса, чтобы выбрать символ из нашего набора и объединить эти символы. 0 и — 1 граница представляет границы строки $charset , поскольку первый символ адресуется с помощью $charset[0] и последний с $charset[count($charset) — 1] .

      Итак, позвольте мне начать с ИСПОЛЬЗОВАТЬ БИБЛИОТЕКУ . Многие существуют:

      Суть проблемы — почти каждый ответ на этой странице подвержен атаке. mt_rand() , rand() , lcg_value() и uniqid() — все это уязвимы для атаки .

      Хорошая система будет использовать /dev/urandom из файловой системы или mcrypt_create_iv() (с MCRYPT_DEV_URANDOM ) или openssl_pseudo_random_bytes() . Что все вышеперечисленное делает. PHP 7 поставляется с двумя новыми функциями random_bytes($len) и random_int($min, $max) , которые также безопасны.

      Имейте в виду, что большинство из этих функций (кроме random_int() ) возвращают «необработанные строки», означающие, что они могут содержать любой символ ASCII из 0 — 255 . Если вам нужна строка для печати, я бы рекомендовал пропустить результат через base64_encode() .

      Обновил код в соответствии с замечательным предложением mzhang в комментариях ниже.

      Лучшая и обновленная версия отличного ответа @ taskamiski:

      Лучшая версия, используя mt_rand() вместо rand()

      Еще лучше, для более длинных строк, используя функцию hash() , которая позволяет выбирать алгоритмы хеширования:


      Если вы хотите сократить результат, скажем, до 50 символов, сделайте это следующим образом:

      Объединение символов в конце должно быть более эффективным, чем повторное объединение строк.

      Редактировать # 1: добавлена ​​опция, позволяющая избежать повторения символов.

      Редактировать # 2: выдает исключение, чтобы избежать попадания в бесконечный цикл, если выбран $ norepeat и $ len больше, чем набор символов для выбора.

      Редактирование # 3: использует ключи массива для хранения выбранных случайных символов, когда выбран $ norepeat, поскольку поиск по ключу ассоциативного массива быстрее, чем линейный поиск в массиве.

      Случайный выбор из массива в PHP

      У меня уже спрашивали пару раз, как я делаю случайный вывод цитат у себя на сайте в блоке «Умные цитаты«. Далее мне удалось выяснить, что проблема здесь с непониманием людей, как вывести случайный элемент из массива в PHP. Задача простая, но тем не менее, раз возникают вопросы, то надо на них отвечать.

      Сразу приведу код. Допустим, есть массив с набором цитат. И нужно выбрать одну случайную из них и вывести:

      Ключевой момент — это получение случайного числа. Всё, что нужно сделать, это задать правильные границы. Если нужно выбрать на всей длине массива случайный элемент, то это от до (длины массива минус 1). А далее просто вытащить элемент из массива с полученным случайным индексом.

      Что касается задачи с цитатами, то их лучше хранить в базе данных. В принципе, если сайт совсем простой, то можно и в текстовом файле. Но если в базе данных, то лучше использовать RAND() и LIMIT в SQL-запросе, чтобы Вы сразу получали единственную и случайную цитату из базы данных.

      Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (https://myrusakov.ru)!

      Добавляйтесь ко мне в друзья ВКонтакте: https://vk.com/myrusakov.
      Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: https://vk.com/rusakovmy.

      Если Вы не хотите пропустить новые материалы на сайте,
      то Вы можете подписаться на обновления: Подписаться на обновления

      Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

      Порекомендуйте эту статью друзьям:

      Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

      Она выглядит вот так:

    • BB-код ссылки для форумов (например, можете поставить её в подписи):
    • Комментарии ( 20 ):

      Я правильно понимаю? $res = $mysqli->query(«SELECT `text` FROM `citata` ORDER BY RAND() LIMIT 1»); $arr = $res->fetch_assoc(); echo $arr[‘text’];

      Да, всё правильно.

      Я не могу понять, а зачем от count($quotes) отнимать 1? Ведь тогда получается, что номер самой последней цитаты мы не принимаем в счет.

      Не рекомендовал бы использовать ORDER BY RAND(), это немного тормозит сайт. Данная функция ускорит данный запрос: function getCitata()< $mysqli = conectDB(); $offset_result = $mysqli->query(«SELECT MIN(` >min,$offset_row->max); $res_ad = $mysqli->query(«SELECT text FROM citata WHERE id >= «.$R >fetch_assoc(); closeDB($mysqli); echo $row_ad[‘text’]; >

      Подскажите куда надо вставлять это код? И еще можно ли сделать что бы при нажатие кнопки текст менялся, если да то напишите))) p.s. Можно по подробней только) спс.

      Вопрос некорректный, рекомендую посмотреть вот этот курс: https://srs.myrusakov.ru/freephp

      У меня мобильный интернет и я не могу скачать видео урок( а в youtube есть видео урок?

      В youtube нет, но с мобильным Интернетом и там не удастся посмотреть.

      А это можно сделать при помощи HTML или JS?

      В JS да, только хранить цитаты надо будет прямо в исходном коде страницы.

      Можете привести скрипт?

      Там есть функция Math.random(), вот её и используйте. А с массивом Вы обязаны уметь работать, а если не умеете, то тогда изучайте JS с нуля.

      Михаил, напишите пожалуйста статью а лучше скрипт полной статистики сайта на PHP и MySQL, я вас очень прошу

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

      Михаил, если такой проект у Вас будет, дадите ссылку.)

      Михаил, а нужно делать unset для массива? после вывода?

      Если он не нужен больше, то можно, хотя никто это не делает, а если потребуется, то нет.

      смотрите, я правильно поняла? то есть в данном случае получается такой код:

      А чем Вам не нравится array_shuffle()? Перемешали массив, выбрали нулевой элемент.

      Для добавления комментариев надо войти в систему.
      Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

      Copyright © 2010-2020 Русаков Михаил Юрьевич. Все права защищены.

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

      Функция rand() PHP не дает хороших случайных чисел. Поэтому я начал использовать mt_rand() который, как говорят, дает лучшие результаты. Но насколько хороши эти результаты? Есть ли какие-то методы для их улучшения?

      Это должно дать вам «идеальные» случайные числа, не так ли?

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

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

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

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

      И, откровенно говоря, похоже, что функция mt_rand использует Mersenne twister , что является довольно хорошим PRNG, так как это, вероятно, будет достаточно хорошим для большинства случайных целей.

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

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

      В комментариях был вопрос, почему выполнение операций с случайным числом может сделать его менее случайным. Например, некоторые PRNG могут возвращать более последовательные, менее случайные числа в разных частях бит – high-end может быть более случайным, чем младший.

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

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

      Быстрый ответ:

      В новом PHP7 есть, наконец, поддержка криптографически защищенных псевдослучайных целых чисел.

      Существует также полипол для PHP5x .

      Более длинный ответ

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

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

      Одним из подмножеств генераторов случайных чисел являются криптографически защищенные генераторы случайных чисел :

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

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

      Но, к счастью, PHP7 реализовал его,

      Генерирует криптографические случайные целые числа, которые подходят для использования, когда критические (непредсказуемые) результаты имеют решающее значение (т. Е. Перетасовка колоды покера).

      Источниками случайных являются следующие:

      • В Windows CryptGenRandom () используется исключительно
      • arc4random_buf () используется, если он доступен (как правило, BSD)
      • / dev / arandom используется, если доступно
      • Сценарий getrandom(2) (на новых ядрах Linux)
      • / dev / urandom используется там, где ни одно из указанных выше не доступно

      Это приводит к тому, что все предыдущие ответы устарели (и некоторые устарели).

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

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

      Каким образом mt_rand () «плохой»?

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

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

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

      По популярному запросу : D

      Я написал cronjob, который периодически получает 1000 чисел из random.org (скажем, один раз в час) и добавляет их в массив PHP. Всякий раз, когда я хочу случайные числа в моем сценарии, я использую mt_rand (0,1000), чтобы вызвать номер из этого. Несколько дополнительных микросекунд накладных расходов, но я получаю действительно случайные числа, основанные на естественном атмосферном шуме.

      Все зависит от того, для чего вам нужно это случайное число �� Для меня ShuffleBag – лучший! ��

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

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

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

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

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

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

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

      использовать / dev / ramdom (генератор случайных чисел реального устройства linux) для семян mt_rand

      Я создал класс PHP для генерации случайных чисел и строк PHPRandomValue

      Он использует «mcrypt_create_iv (4, MCRYPT_DEV_URANDOM)» для генерации случайных чисел и значений. Я сделал это, работая над криптопроектом, потому что мне нужен безопасный генератор случайных значений. Вот пример использования

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

      Случайные числа Tru

      а также криптозащита;)

      Хотя ответ был принят много лет назад, я снова его открою.

      Так как вся эта случайность зависит от системного времени, давайте также испортить системное время! Количество времени, которое занимает операция на компьютере, на самом деле довольно изменчиво (особенно, если на этом сервере происходит что-то другое), поэтому, если мы воспользуемся этим с помощью microtime … (не удалось найти какие-либо переносные команды nanotime)

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

      Случайность в PHP7 – Повезет ли мне?

      В этой статье мы проанализируем проблемы, относящиеся к генерации случайных чисел, используемых в криптографии. PHP5 не обеспечивает простой механизм генерации криптостойких случайных чисел, в то время как PHP7 решает эту проблему путем введения CSPRNG-функций.

      Что такое CSPRNG?

      Цитируя википедию, криптографически стойкий генератор псевдослучайных чисел (англ. Cryptographically secure pseudorandom number generator, CSPRNG) — это генератор псевдослучайных чисел с определёнными свойствами, позволяющими использовать его в криптографии.

      CSPRNG в основном используется для следующих целей:

      • Генерация ключей (в том числе, генерация public/private ключей)
      • Создание случайных паролей для аккаунтов пользователей
      • Системы шифрования

      Главным аспектом сохранения высокого уровня безопасности является высокое качество случайности.

      CSPRNG в PHP7

      PHP7 вводит две новых функции, которые могут быть использованы для CSPRNG: random_bytes и random_int .

      Функция random_bytes возвращает строку и принимает в качестве входных параметров int , задающий длину (в байтах) возвращаемого значения:

      random_int возвращает целое число в заданном диапазоне:

      За кадром

      Простой тест

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

      Один из самых простых тестов — игра в кости. Предполагаемая вероятность выпадения шестерки при одной кости — один к шести, в то же время, если я брошу три кости 100 раз, то ожидаемые выпадения 1, 2 и 3х шестерок примерно такие:

      • 0 шестерок = 57.9 раз
      • 1 шестерка = 34.7 раз
      • 2 шестерки = 6.9 раз
      • 3 шестерки = 0.5 раз

      Вот код для воспроизведения броска костей 1 000 000 раз:

      Прогонка кода в PHP7 c использованием random_int и простого rand выдаст следующие результаты:

      Шестерки Ожидаемый результат random_int rand
      579000 579430 578179
      1 347000 346927 347620
      2 69000 68985 69586
      3 5000 4658 4615

      Для лучшего сравнения rand и random_int построим график результатов, применяя формулу: результат PHP — ожидаемый результат / sqrt(ожидаемый результат) .

      График будет выглядеть так (чем ближе к нулю, тем лучше):

      Даже несмотря на плохой результат с тремя шестерками и всю простоту теста, мы видим явное превосходство random_int над rand .

      А что насчет PHP5?

      По умолчанию, PHP5 не предусматривает каких-либо сильных псевдо-генераторов случайных чисел. Но на самом деле есть несколько вариантов, таких как openssl_random_pseudo_bytes() , mcrypt_create_iv() или непосредственное использование /dev/random или /dev/urandom с fread() . Есть также такие библиотеки, как RandomLib или libsodium.

      Если вы хотите начать использовать хороший генератор случайных чисел и в то же время пока еще не готовы к переходу на PHP7, вы можете использовать библитеку random_compat от Paragon Initiative Enterprises. Она позволяет использовать random_bytes() и random_int() в PHP 5.х проектах.

      Библиотеку можно установить через Composer:

      По сравнению с PHP7, random_compat использует несколько другие приоритеты:

      1. fread() /dev/urandom если доступно
      2. mcrypt_create_iv($bytes, MCRYPT_CREATE_IV)
      3. COM(‘CAPICOM.Utilities.1’)->GetRandom()
      4. openssl_random_pseudo_bytes()

      Дополнительную информацию о том почему используется именно этот порядок вы можете прочитать в документации.

      Пример генерации пароля с использованием библиотеки:

      Краткий итог

      Вы всегда должны применять криптографически стойкие генераторы псевдослучайных чисел, и random_compat является хорошим решением для этого.

      Если же вам необходим надежный источник случайных данных, то посмотрите в сторону random_int и random_bytes .

      Получение списка элементов с помощью php

      Я пытаюсь извлечь список элементов из базы данных mySQL и вставить их в качестве списка в объект select на веб-странице. Ниже приведен бит кода, который не работает.

      В первой строке я пытаюсь извлечь объект JSON из общедоступной функции getBrands () в одноэлементном объекте DatabaseInterface, который я создал.

      Вторая строка затем пытается превратить этот объект JSON в массив php.

      Наконец, я запускаю цикл, который может выбрать каждый элемент между тегами для веб-страницы.

      EDIT: если это поможет, вот мой DatabaseInterface синглтон. Я включил этот файл в верхней части моего файла php

      1 ответ

      В коде нет ничего «неправильного» в том, что он должен работать (при условии, что ничто не нарушено на стороне запроса). Однако есть несколько вещей, которые следует улучшить.

      Во-первых, в основном то, что getBrands() делает метод, эквивалентно этому:

      Теперь, когда вы декодируете, что вы получаете то же самое, что вы изначально положили в (массив):

      Так как это массив (не объект PHP), вы можете просто использовать foreach.

      Если вы беспокоитесь о том, что это объект в некоторых случаях (возможно, у вас был объект без массива JS, который был бы в основном эквивалентен ассоциативному массиву PHP), вы можете привести результат json_decode в массив.

      Теперь, в вашем getBrands() методе, я бы очень рекомендовал просто использовать $row[‘psBrandName’] вместо того, чтобы загромождать вещи extract , если у вас нет действительно хорошей причины делать это.

      Получение случайных элементов с помощью PHP

      array_rand — Выбрать одно или несколько случайных значений из массива

      Описание mixed array_rand ( array input [, int num_req] )

      Использование array_rand() предпочтительно, если вам нужно выбрать одно или несколько случайных значений из массива. Эта функция в качестве параметров берёт массив input и дополнительный аргумент num_req , который определяет количество значений, которое вы хотите выбрать — если не определён, то 1.

      Если вы выбираете только одно значение, функция array_rand() возвращает ключ, соответствующий этому значению. В обратном случае, она возвращает массив ключей, соответствующих случайным значениям. Это означает, что вы можете выбрать из массива как случайные значения, так и случайные ключи.

      Замечание: Начиная с PHP 4.2.0, больше нет необходимости инициализировать генератор случайных чисел функциями srand() или mt_srand() , поскольку теперь это происходит автоматически.

      Пример 1. Пример использования array_rand()

      Мастер Йода рекомендует:  Эффективная криптография на Java
Добавить комментарий