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

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

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

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

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

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

Читайте также:  Как вывести грязь с белого

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

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://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(`id`) AS min, MAX(`id`) AS max FROM citata»); $offset_row = mysqli_fetch_object($offset_result); $RID = mt_rand($offset_row->min,$offset_row->max); $res_ad = $mysqli->query(«SELECT text FROM citata WHERE id >= «.$RID.» LIMIT 1″); $row_ad = $res_ad->fetch_assoc(); closeDB($mysqli); echo $row_ad[‘text’]; >

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Источник

    array_rand

    (PHP 4, PHP 5, PHP 7, PHP 8)

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

    Описание

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

    Список параметров

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

    Возвращаемые значения

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

    Список изменений

    Версия Описание
    7.1.0 Внутренний алгоритм получения случайных чисел изменён с функции rand библиотеки libc на генератор на базе » Вихря Мерсенна.

    Примеры

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

    Смотрите также

    User Contributed Notes 5 notes

    If the array elements are unique, and are all integers or strings, here is a simple way to pick $n random *values* (not keys) from an array $array:

    ( array_flip ( $array ), $n ); ?>

    /**
    * Wraps array_rand call with additional checks
    *
    * TLDR; not so radom as you’d wish.
    *
    * NOTICE: the closer you get to the input arrays length, for the n parameter, the output gets less random.
    * e.g.: array_random($a, count($a)) == $a will yield true
    * This, most certainly, has to do with the method used for making the array random (see other comments).
    *
    * @throws OutOfBoundsException – if n less than one or exceeds size of input array
    *
    * @param array $array – array to randomize
    * @param int $n – how many elements to return
    * @return array
    */
    function array_random (array $array , int $n = 1 ): array
    <
    if ( $n 1 || $n > count ( $array )) <
    throw new OutOfBoundsException ();
    >

    return ( $n !== 1 )
    ? array_values ( array_intersect_key ( $array , array_flip ( array_rand ( $array , $n ))))
    : array( $array [ array_rand ( $array )]);
    >

    // An example how to fetch multiple values from array_rand
    $a = [ ‘a’ , ‘b’ , ‘c’ , ‘d’ , ‘e’ , ‘f’ , ‘g’ ];
    $n = 3 ;

    // If you want to fetch multiple values you can try this:
    print_r ( array_intersect_key ( $a , array_flip ( array_rand ( $a , $n ) ) ) );

    // If you want to re-index keys wrap the call in ‘array_values’:
    print_r ( array_values ( array_intersect_key ( $a , array_flip ( array_rand ( $a , $n ) ) ) ) );

    array_rand () takes a random value without ever being able to go back in its choice of random value.
    A simple example:
    I decide to mix an array of 10 entries to retrieve 3 values. This choice will give increasing and random values.

    $pm = array_rand($myarray,3);
    // $pm return array(0->0,1->6,2->8)

    But if I decide to shuffle an array of 10 entries to get 10 entries, array_rand () will choose to assign a value to each return value and therefore the return array will not be random.

    $gm = array_rand($myarray,count($myarray));
    // $gm not random array(0->0,1->1,2->2,3->3,4->4,5->5,6->6,7->7,8->8,9->9)

    The easiest way to have a truly random value:
    either use array_rand () in a loop of 1 value at a time

    $deg = range(-60,60);
    $size = range(16,64);
    $color = [«blue»,»red»,»green»,»pink»,»orange»,»purple»,»grey»,»darkgreen»,»darkkhaki»];
    $i = 0;
    $longueur = 10;
    do <
    ++$i;
    printf(» %s «,
    $deg[array_rand($deg)],
    $size[array_rand($size)],
    $color[array_rand($color)],
    $alnum[array_rand($alnum)]);

    Источник

    C Sharp/C# — Рандомное заполнение массива

    Всем привет. Сегодня немножко поработаем с массивами. Научимся объявлять и работать с ними. О сложной теории относительно внутренностей массива мы говорить не будем. Если вкратце — массив, это набор элементов, к каждому из которых можно обратиться по индексу. Массивы позволяют вам вместо объявления нескольких переменных, создать всего одну. Перейдем к основному вопросу. Сегодня мы попробуем реализовать рандомное заполнение массива на C#.

    Рандомное заполнение массива на C Sharp/C#

    Итак, прежде чем заполнять массив рандомными числами, необходимо объявить массив. Сделать это достаточно просто:

    Таким образом мы объявили массив элементов типа int (целочисленное) с именем myArray содержащий в себе 5 элементов. Клише любой статьи про массивы: помните, первый элемент массива доступен по индексу 0.

    Итак. Теперь необходимо объявить рандомный метод, который находится в библиотеке System.Random. Если в дальнейшем вы будете использовать еще какие-то методы, то в самом верху вашего кода напишите using System. Если нет, то достаточно прописать using System.Random. Метод объявляем следующим образом:

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

    Последняя строка выведет каждый элемент массива в консоль. Обратите внимание на эту часть: rand.Next(20); Здесь мы указываем, что максимально возможное значение любого элемента массива не может быть больше цифры 20.

    При запуске программы получаем следующий аутпут:

    К каждому из элементов можно прилепить описание индекса к примеру. При чем не нужно это делать отдельно для каждого элемента, а достаточно изменить код следующим образом:

    В результате мы получим следующий красивые и понятный вывод:

    Обратите внимание, что последний индекс массива равен 4, а элементов всего 5. В целом в выводе явно указано, что первый элемент массива находится под индексом 0.

    В итоге:

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

    Надеемся, что данная статья была для вас полезной! Самой большой наградой для нас будет подписка на нашу группу в ВК и youtube канал!

    Источник

    Pascal: Занятие № 5. Одномерные массивы в Паскале

    Одномерные массивы в Паскале

    Объявление массива

    Массивы в Паскале используются двух типов: одномерные и двумерные.
    Определение одномерного массива в Паскале звучит так: одномерный массив — это определенное количество элементов, относящихся к одному и тому же типу данных, которые имеют одно имя, и каждый элемент имеет свой индекс — порядковый номер.
    Описание массива в Паскале (объявление) и обращение к его элементам происходит следующим образом:

    var dlina: array [1..3] of integer; begin dlina[1]:=500; dlina[2]:=400; dlina[3]:=150; .

    Объявить размер можно через константу:

    Инициализация массива

    Кроме того, массив может быть сам константным, т.е. все его элементы в программе заранее определены. Описание такого массива выглядит следующим образом:

    const a:array[1..4] of integer = (1, 3, 2, 5);

    Заполнение последовательными числами:

    var a: array of integer; var n:=readInteger; a:=new integer[n];

    var a: array of integer; var n:=readInteger; SetLength(a,n); // устанавливаем размер

    begin var a: array of integer; a := new integer[3]; a[0] := 5; a[1] := 2; a[2] := 3; end.

    или в одну строку:

    begin var a: array of integer; a := new integer[3](5,2,3); print(a) end.

    Ввод с клавиатуры:

    writeln (‘введите кол-во элементов: ‘); readln(n); <если кол-во заранее не известно, - запрашиваем его>for i := 1 to n do begin write(‘a[‘, i, ‘]=’); read(a[i]); . end; .


    ✍ Пример результата:

    var a:=ReadArrInteger(5); // целые var a:=ReadArrReal(5); // вещественные

    Вывод элементов массива

    var a: array[1..5] of integer; <массив из пяти элементов>i: integer; begin a[1]:=2; a[2]:=4; a[3]:=8; a[4]:=6; a[5]:=3; writeln(‘Массив A:’); for i := 1 to 5 do write(a[i]:2); <вывод элементов массива>end.

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

    [Название файла: taskArray0.pas ]

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

    for var i:=0 to a.Length-1 do a[i] += 1;

    Проход по элементам (только для чтения):
    Пример:

    foreach var x in a do Print(x)

    Функция Random в Pascal

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

    Диапазон в Паскале тех самых случайных чисел от a до b задается формулой:

    var f: array[1..10] of integer; i:integer; begin randomize; for i:=1 to 10 do begin f[i]:=random(10); < интервал [0,9] >write(f[i],’ ‘); end; end.

    Для вещественных чисел в интервале [0,1]:

    var x: real; . x := random(0.0,1.0);;

    или с дополнительными параметрами (диапазон [5;15]):

    [Название файла: taskArray1.pas ]

    Числа Фибоначчи в Паскале

    Наиболее распространенным примером работы с массивом является вывод ряда чисел Фибоначчи в Паскаль. Рассмотрим его.

    Получили формулу элементов ряда.

    var i:integer; f:array[0..19]of integer; begin f[0]:=1; f[1]:=1; for i:=2 to 19 do begin f[i]:=f[i-1]+f[i-2]; writeln(f[i]) end; end.

    На данном примере, становится понятен принцип работы с числовыми рядами. Обычно, для вывода числового ряда находится формула определения каждого элемента данного ряда. Так, в случае с числами Фибоначчи, эта формула-правило выглядит как f[i]:=f[i-1]+f[i-2] . Поэтому ее необходимо использовать в цикле for при формировании элементов массива.

    [Название файла: taskArray2.pas ]

    Максимальный (минимальный) элемент массива

    Псевдокод:

    Поиск максимального элемента по его индексу:

    // … var (min, minind) := (a[0], 0); for var i:=1 to a.Length-1 do if a[i]

    [Название файла: taskArray_min.pas ]

    [Название файла: taskArray4.pas ]

    [Название файла: taskArray5.pas ]

    [Название файла: taskArray6.pas ]

    Пример:

    [Название файла: taskArray7.pas ]

    Поиск в массиве

    Рассмотрим сложный пример работы с одномерными массивами:

    Для решения поставленной задачи понадобится оператор break — выход из цикла.
    Решение Вариант 1. Цикл for:

    var f: array[1..10] of integer; flag:boolean; i,c:integer; begin randomize; for i:=1 to 10 do begin f[i]:=random(10); write(f[i],’ ‘); end; flag:=false; writeln(‘введите образец’); readln(c); for i:=1 to 10 do if f[i]=c then begin writeln(‘найден’); flag:=true; break; end; if flag=false then writeln(‘не найден’); end.

    begin var a := new integer[10]; a := arrRandomInteger(5,0,5); //[1,3,5,4,5] print(a.IndexOf(3)) // 1 end.

    или метод a.Contains(x) наравне с x in a :

    begin var a := new integer[10]; a := arrRandomInteger(5,0,5); //[1,3,5,4,5] print(a.Contains(3)); // True print(3 in a)// True end.

    Рассмотрим эффективное решение:

    Задача: найти в массиве элемент, равный X , или установить, что его нет.

    Алгоритм:

    • начать с 1-го элемента ( i:=1 );
    • если очередной элемент ( A[i] ) равен X , то закончить поиск иначе перейти к следующему элементу.

    решение на Паскале Вариант 2. Цикл While:

    Поиск элемента в массиве

    Предлагаем посмотреть подробный видео разбор поиска элемента в массиве (эффективный алгоритм):

    Пример:

    [Название файла: taskArray8.pas ]

    Циклический сдвиг

    Решение:

    Программа:

    // … var v := a[0]; for var i:=0 to a.Length-2 do a[i] := a[i+1]; a[a.Length-1] := v;

    // … var v := a[a.Length-1]; for var i:=a.Length-1 downto 1 do a[i] := a[i-1]; a[0] := v;

    [Название файла: taskArray9.pas ]

    Перестановка элементов в массиве

    Рассмотрим, как происходит перестановка или реверс массива.

    Решение:

    Псевдокод:

    Программа:

    begin var a: array of integer := (1,3,5,7); var n := a.Length; for var i:=0 to n div 2 — 1 do Swap(a[i],a[n-i-1]); End.

    Решение 2 (стандартная процедура Reverse() ):

    begin var a:=new integer[10]; a:=arrRandomInteger(10); print(a);// [41,81,84,63,12,26,88,25,36,72] Reverse(a); print(a) //[72,36,25,88,26,12,63,84,81,41] end.

    [Название файла: taskArray10.pas ]

    Выбор элементов и сохранение в другой массив

    Решение:


    Вывод массива B:

    writeln(‘Выбранные элементы’); for i:=1 to count-1 do write(B[i], ‘ ‘)

    // . for var i := 0 to a.length — 1 do if a[i]

    [Название файла: taskArray11.pas ]

    Сортировка элементов массива

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

    for i:=1 to N-1 do begin for j:=N-1 downto i do if A[j] > A[j+1] then begin с := A[j]; A[j] := A[j+1]; A[j+1] := с; end; end;

    for var i := 0 to arr.High — 1 do for var j := arr.High — 1 downto i do if arr[j] > arr[j + 1] then Swap(arr[j], arr[j + 1]);

    [Название файла: taskArray12.pas ]

    • в массиве ищется минимальный элемент и ставится на первое место (меняется местами с A[1]);
    • среди оставшихся элементов также производится поиск минимального, который ставится на второе место (меняется местами с A[2]) и т.д.

    Pascal PascalABC.NET

    for i := 1 to N-1 do begin min:= i ; for j:= i+1 to N do if A[j] i then begin c:=A[i]; A[i]:=A[min]; A[min]:=c; end; end;

    for var i := 0 to a.High-1 do begin var (min,imin) := (a[i],i); for var j := i + 1 to a.High do if a[j] [Название файла: taskArray13.pas ]

      Выбирается и запоминается средний элемент массива (присвоим X):

  • Инициализируем две переменные (будущие индексы массива): L:=1, R:=N (N — количество элементов).
  • Увеличиваем L и ищем первый элемент A[L], который больше либо равен X (в итоге он должен находиться справа).
  • Уменьшаем R и ищем элемент A[R], который меньше либо равен X (в итоге он должен находиться слева).
  • Смотрим, если L X do R:= R — 1; if L [Название файла: taskArray14.pas ]
    Рубрики:

    См. пузырьковая сортировка.
    При второй итерации цикла (согласно вашим рисункам и коду ) нет надобности сравнивать первый элемент со вторым. Снова вы всех путаете =)

    admin

    Именно поэтому в коде : for j:=N-1 downto i do

    downto i — то есть мы доходим сначала до первого элемента, потом до второго и т.д.

    Bronislav

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

    Владимир

    А как насчёт странного способа поменки оандомням образом, конечно это долго , но все таки есть
    Var
    A: array[1..10] of integer;
    I,e,r,r1: integer;
    Begin
    While i в 02:05

    В сохранении в другой массив ошибка. Надо поменять местами счётчик и команду сохранения. В массиве В нет элемента 0.

    Aurangzeb

    А как заполнить случайными числами (из файла!) такой массив: Type mass=array[1..n] of smallint; var A:array[1..n] of mass… В файле они введены, допустим, квадратно! Потом её нужно перевернуть и записать в выходной файл! Подумайте!

    Источник

    Оцените статью
  • Pascal PascalABC.NET