Php массив с рандомными числами

Php массив с рандомными числами

Я пытаюсь создать массив случайных чисел из 0-n, затем перетасовать (но убедитесь, что ключи и значения НЕ совпадают).

Обратите внимание, что оба ключа и значения от 0 до 4, но ни один из ключей и значений не меняется.

Еще более короткое решение:

Я считаю, что довольно длинное, но также довольно эффективное решение. В отличие от других решений, размещенных здесь, это не может быть deadlock (если не $size ), и это не будет делать полный перетасовки каждый раз, когда одно значение не подходит. Вместо этого он заменит это значение другим случайным значением.

Вышеупомянутое напечатает что-то похожее

изменить: s / rand / mt_rand /

edit # 2: оба решения могут оказаться в тупике, как упоминалось в @AMayer. Я стою исправлено.

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

You must login or register to post a reply

Posts: 3

1 Topic by PunBB 2016.04.25 02:35

  • PunBB
  • Admin
  • Offline
  • More info

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

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

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

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

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

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

    2 Reply by PunBB 2016.04.25 02:38

  • PunBB
  • Admin
  • Offline
  • More info

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

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

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

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

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

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

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

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

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

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

    (PHP 4, PHP 5, PHP 7)

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

    Описание

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

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

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

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

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

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

    Версия Описание
    7.1.0 Внутренний алгоритм получения случайных чисел изменен с функции rand библиотеки libc на генератор на базе » Вихря Мерсена.
    5.2.10 Возвращаемый массив ключей больше не возвращается в случайном порядке.
    4.2.0 Генератор случайных чисел инициализируется автоматически.

    Примеры

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

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

    User Contributed Notes 40 notes

    Note: array_rand uses the libc generator, which is slower and less-random than Mersenne Twister.

    $website = $a [ mt_rand ( 0 , count ( $a ) — 1 )];
    ?>

    This is a better alternative.

    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 ); ?>

    Looks like this function has a strange randomness.

    If you take any number of elements in an array which has 40..100 elements, the 31st one is always by far the less occuring (by about 10% less than others).

    I tried this piece of code at home (PHP Version 5.3.2-1ubuntu4.9) and on my server (PHP Version 5.2.17), unfortunately i haven’t any server with the last version here :

    = range ( 1 , 40 );
    $proba = array_fill ( 1 , 40 , 0 );
    for ( $i = 0 ; $i 10000 ; ++ $i )
    <
    $tirage_tab = array_rand ( $valeurs , 10 );
    foreach( $tirage_tab as $key => $value )
    <
    $proba [ $valeurs [ $value ]]++;
    >
    >

    asort ( $proba );
    echo "Proba :
    " ;
    foreach( $proba as $key => $value )
    <
    echo " $key : $value
    " ;
    >
    ?>

    In every try, the number of occurrences change a bit but the 31 is always far less (around 2200) than the others (2400-2600). I tried with 50 and 100 elements, no change. I tried with more or less elements to pick (second parameter to array_rand), same result. If you pick only one element it’s even worse : 31 has half the result of the others.

    For this particular case, i recommend shuffling the array and taking the nth first elements, in this test it’s 60% faster and the statistics are ok.

    /**
    * 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 ) ) ) ) );

    An example for getting random value from arrays;

    function array_random ( $arr , $num = 1 ) <
    shuffle ( $arr );

    $r = array();
    for ( $i = 0 ; $i $num ; $i ++) <
    $r [] = $arr [ $i ];
    >
    return $num == 1 ? $r [ 0 ] : $r ;
    >

    $a = array( "apple" , "banana" , "cherry" );
    print_r ( array_random ( $a ));
    print_r ( array_random ( $a , 2 ));
    ?>

    cherry
    Array
    (
    [0] => banana
    [1] => apple
    )

    And example for getting random value from assoc arrays;

    function array_random_assoc ( $arr , $num = 1 ) <
    $keys = array_keys ( $arr );
    shuffle ( $keys );

    $r = array();
    for ( $i = 0 ; $i $num ; $i ++) <
    $r [ $keys [ $i ]] = $arr [ $keys [ $i ]];
    >
    return $r ;
    >

    $a = array( "a" => "apple" , "b" => "banana" , "c" => "cherry" );
    print_r ( array_random_assoc ( $a ));
    print_r ( array_random_assoc ( $a , 2 ));
    ?>

    Array
    (
    [c] => cherry
    )
    Array
    (
    [a] => apple
    [b] => banana
    )

    I agree with Sebmil (http://php.net/manual/en/function.array-rand.php#105265) that "array_rand()" produces weird and very uneven random distribution (as of my local PHP 5.3.8 and my public host’s PHP 5.2.17).
    Unfortunately, I haven’t got any access either to a server with the latest PHP version. My info is for those of you who like to check things for themselves and who don’t believe all of the official statements in the docs.
    I’ve made a simple adjustment of his test code like this:
    = 1 ; // Start value
    $c = 50 ; // Count / End value
    $test = array_fill ( $s , $c , 0 );
    $ts = microtime ( true );
    for( $i = 0 ; $i 5000000 ; $i ++) <
    $idx = mt_rand ( $s , $c ); // Try it with rand() — simpler but more evenly distributed than mt_rand()
    $test [ $idx ]++;
    >
    $te = microtime ( true );
    $te =( $te — $ts )* 1000.0 ; // Loop time in miliseconds

    asort ( $test );
    echo "Test mt_rand() in " . $te . " ms:
    " ;
    foreach( $test as $k => $v ) echo " $k : $v
    " ;
    ?>

    And it appears to me that simple "$idx=rand(0, count($test)-1);" is much better than "$idx=array_rand($test, 1);".
    And what’s more the simpler and a bit slower (0 ms up to total 712.357 ms at 5 mln cycles) "rand()" is better than "mt_rand()" in simple everyday use cases because it is more evenly distributed (difference least vs. most often numbers: ca. 0.20-1.28 % for "rand()" vs. ca. 1.43-1.68 % for "mt_rand()").
    Try it for yourself. although it depends on your software and hardware configuration, range of numbers to choose from (due to random patterns), number of cycles in the loop, and temporary (public) server load as well.

Ссылка на основную публикацию
Macrium reflect инструкция на русском
Windows Linux Mac OS Windows Phone Android Меню сайта Партнеры Статьи » Практикум Macrium Reflect инструкция пользователя Macrium Reflect —...
Gigabyte gtx 470 характеристики
Описание NVIDIA начала продажи GeForce GTX 470 12 апреля 2010 по рекомендованной цене 349$. Это десктопная видеокарта на архитектуре Fermi...
Gigabyte h81m s2pv обзор
Большинство людей (клиентов интернет-магазинов) стараются перед покупкой собрать всю информацию о GIGABYTE GA-H81M-S2PV (rev. 1.0). В этот набор входят и...
Mad moxxi borderlands 2
Неигровой персонаж в "Borderlands", "Borderlands 2" и "Borderlands: The Pre-Sequel", а также в "Poker Night 2" и "Tales from the...
Adblock detector