Random int

Fetch a random integer between $min and $max inclusive

Хуков нет.

Возвращает

Число.

Использование

random_int( $min, $max );
$min(число) (обязательный)
$max(число) (обязательный)

Код random int: wp-includes/random_compat/random_int.php VER 5.0.2

<?php function random_int($min, $max) {  /**  * Type and input logic checks  *   * If you pass it a float in the range (~PHP_INT_MAX, PHP_INT_MAX)  * (non-inclusive), it will sanely cast it to an int. If you it's equal to  * ~PHP_INT_MAX or PHP_INT_MAX, we let it fail as not an integer. Floats   * lose precision, so the <= and => operators might accidentally let a float  * through.    
/ try { $min = RandomCompat_intval($min); } catch (TypeError $ex) { throw new TypeError( 'random_int(): $min must be an integer' ); } try { $max = RandomCompat_intval($max); } catch (TypeError $ex) { throw new TypeError( 'random_int(): $max must be an integer' ); } /** * Now that we've verified our weak typing system has given us an integer, * let's validate the logic then we can move forward with generating random * integers along a given range. */ if ($min > $max) { throw new Error( 'Minimum value must be less than or equal to the maximum value' ); } if ($max === $min) { return $min; } /** * Initialize variables to 0 * * We want to store: * $bytes => the number of random bytes we need * $mask => an integer bitmask (for use with the &) operator * so we can minimize the number of discards */ $attempts = $bits = $bytes = $mask = $valueShift = 0; /** * At this point, $range is a positive number greater than 0. It might * overflow, however, if $max - $min > PHP_INT_MAX. PHP will cast it to * a float and we will lose some precision. */ $range = $max - $min; /** * Test for integer overflow: */ if (!is_int($range)) { /** * Still safely calculate wider ranges. * Provided by @CodesInChaos, @oittaa * * @ref https://gist.github.com/CodesInChaos/03f9ea0b58e8b2b8d435 * * We use ~0 as a mask in this case because it generates all 1s * * @r.
*/ do { /** * The rejection probability is at most 0.5, so this corresponds * to a failure probability of 2^-128 for a working RNG */ if ($attempts > 128) { throw new Exception( 'random_int: RNG is broken - too many rejections' ); } /** * Let's grab the necessary number of random bytes */ $randomByteString = random_bytes($bytes); if ($randomByteString === false) { throw new Exception( 'Random number generator failure' ); } /** * Let's turn $randomByteString into an integer * * This uses bitwise operators (<< and |) to build an integer * out of the values extracted from ord() * * Example: [9F] | [6D] | [32] | [0C] => * 159 + 27904 + 3276800 + 201326592 => * 204631455 */ $val = 0; for ($i = 0; $i < $bytes; ++$i) { $val |= ord($randomByteString[$i]) << ($i * 8); } /** * Apply mask */ $val &= $mask; $val += $valueShift; ++$attempts; /** * If $val overflows to a floating point number, * ... or is larger than $max, * ... or smaller than $min, * then try again. */ } while (!is_int($val) || $val > $max || $val < $min); return (int) $val; }

wp-kama.ru


This function is based on Andrew Moore's UUID generation function on the uniqid function; it has been updated to use random_int() on PHP 7.0 or later yet continue to function with earlier versions using mt_rand().

function generateUUIDv4()
{
    if(version_compare(PHP_VERSION,'7.0.0', '<') )
    {
        return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
       
        // 32 bits for "time_low"
        mt_rand(0, 0xffff), mt_rand(0, 0xffff),
       
        // 16 bits for "time_mid"
        mt_rand(0, 0xffff),
       
        // 16 bits for "time_hi_and_version",
        // four most significant bits holds version number 4
        mt_rand(0, 0x0fff) | 0x4000,
       
        // 16 bits, 8 bits for "clk_seq_hi_res",
        // 8 bits for "clk_seq_low",
        // two most significant b.
 
        // 32 bits for "time_low"
        random_int(0, 0xffff), random_int(0, 0xffff),
       
        // 16 bits for "time_mid"
        random_int(0, 0xffff),
       
        // 16 bits for "time_hi_and_version",
        // four most significant bits holds version number 4
        random_int(0, 0x0fff) | 0x4000,
       
        // 16 bits, 8 bits for "clk_seq_hi_res",
        // 8 bits for "clk_seq_low",
        // two most significant bits holds zero and one for variant DCE1.1
        random_int(0, 0x3fff) | 0x8000,
       
        // 48 bits for "node"
        random_int(0, 0xffff), random_int(0, 0xffff), random_int(0, 0xffff)
        );
    }
}

mirrors.segmentfault.com

Что такое CSPRNG?

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

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

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

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

CSPRNG в PHP7

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

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

$bytes = random_bytes(10); var_dump(bin2hex($bytes)); //possible ouput: string(20) "7dfab0af960d359388e6"  

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

var_dump(random_int(1, 100)); //possible output: 27 

За кадром

Источники случайности вышеперечисленных функций отличаются в зависимости от среды:


  • В Windows всегда будет использоваться CryptGenRandom();
  • На других платформах — при условии доступности будет задействована arc4random_buf() (верно в случае BSD-производных систем или систем с libbsd).
  • В случае недоступности вышеобозначенного, в Linux будет использоваться системный getrandom(2).
  • Если все это терпит неудачу, в качестве финальной попытки PHP попробует задействовать /dev/urandom.
  • При невозможности использовать эти источники будет выброшена ошибка.

Простой тест

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

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

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

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

$times = 1000000; $result = []; for ($i=0; $i < $times; $i++) {  $dieRoll = array(6 => 0); //initializes just the six counting to zero  $dieRoll[roll()] += 1; //first die  $dieRoll[roll()] += 1; //second die  $dieRoll[roll()] += 1; //third die  $result[$dieRoll[6]] += 1; //counts the sixes } function roll() {  return random_int(1,6); } var_dump($result);     

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

Шестерки Ожидаемый результат random_int rand
0 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:

composer require paragonie/random_compat 

require 'vendor/autoload.php'; $string = random_bytes(32); var_dump(bin2hex($string)); // string(64) "8757a27ce421b3b9363b7825104f8bc8cf27c4c3036573e5f0d4a91ad2aaec6f" $int = random_int(0,255); var_dump($int); // int(81) 

По сравнению с 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()

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

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

$passwordChar = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $passwordLength = 8; $max = strlen($passwordChar) - 1; $password = ''; for ($i = 0; $i < $passwordLength; ++$i) {  $password .= $passwordChar[random_int(0, $max)]; } echo $password; //possible output: 7rgG8GHu     

Краткий итог

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

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

habr.com

This function is based on Andrew Moore's UUID generation function on the uniqid function; it has been updated to use random_int() on PHP 7.0 or later yet continue to function with earlier versions using mt_rand().

function generateUUIDv4()
{
    if(version_compare(PHP_VERSION,'7.0.0', '<') )
    {
        return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
       
        // 32 bits for "time_low"
       .
  // 16 bits, 8 bits for "clk_seq_hi_res",
        // 8 bits for "clk_seq_low",
        // two most significant bits holds zero and one for variant DCE1.1
        mt_rand(0, 0x3fff) | 0x8000,
       
        // 48 bits for "node"
        mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
        );
    }
    else
    {
        return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
       
        // 32 bits for "time_low"
        random_int(0, 0xffff), random_int(0, 0xffff),
       
        // 16 bits for "time_mid"
        random_int(0, 0xffff),
       
        // 16 bits for "time_hi_and_version",
        // four most significant bits holds version number 4
        random_int(0, 0x0fff) | 0x4000,
       
        // 16 bits, 8 bits for "clk_seq_hi_res",
        // 8 bits for "clk_seq_low",
        // two most significant bits holds zero and one for variant DCE1.1
        random_int(0, 0x3fff) | 0x8000,
       
        // 48 bits for "node"
        random_int(0, 0xffff), random_int(0, 0xffff), random_int(0, 0xffff)
        );
    }
}

php.net

Вопрос выглядит очень просто, но ответ немного сложный. Если вы видите, что почти все предложили использовать класс Random, а некоторые предложили использовать класс криптовагонов RNG. Но тогда, когда выбирать, что.

Для этого нам нужно сначала понять термин RANDOMNESS и философию, стоящую за ним.

Я бы посоветовал вам посмотреть это видео, которое подробно изложено в философии RANDOMNESS, используя C # https://www.youtube.com/watch?v=tCYxc-2-3fY

Во-первых, давайте понять философию RANDOMNESS. Когда мы говорим человеку, чтобы выбрать между RED, GREEN и YELLOW, что происходит внутри страны. Что заставляет человека выбирать КРАСНЫЙ или ЖЕЛТЫЙ или ЗЕЛЕНЫЙ?

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

Теперь, если SEED легко догадаться, тогда такие случайные числа называются PSEUDO, и когда семя трудно угадать, эти случайные числа называются SECURED случайными числами.

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

Теперь позвольте мне сделать важное заявление:

* «Случайный» класс генерирует только случайное число PSEUDO и генерирует безопасное случайное число, которое нам нужно использовать для класса «RNGCryptoServiceProvider».

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

Random rnd= new Random(); int rndnumber = rnd.Next() 

В то время как класс RNGCryptoServiceProvider использует энтропию OS для генерации семян. Энтропия ОС — это случайное значение, которое генерируется с использованием звука, щелчка мышью и таймингов клавиатуры, термической температуры и т. Д. Ниже приведен код для того же самого.

using (RNGCryptoServiceProvider rg = new RNGCryptoServiceProvider())  {   byte[] rno = new byte[5];   rg.GetBytes(rno);   int randomvalue = BitConverter.ToInt32(rno, 0);  } 

Чтобы понять энтропию ОС, см. Это видео с 14:30 https://www.youtube.com/watch?v=tCYxc-2-3fY где объясняется логика энтропии ОС. Таким образом, вводя простые слова, RNG Crypto генерирует безопасные случайные числа.

code-examples.net

Random int

Доброго времени суток! Эта статья носит практический характер и в ней я расскажу о том, как использовать генератор случайных чисел в C# и для чего это Вам может пригодиться. Хотя, если на чистоту, то речь пойдет о генераторе псевдослучайных чисел…

Где нам могут понадобиться случайные числа, да на самом деле можно привести в пример много случаев, например, криптография, или механизмы разрешения различных коллизий. Поверьте, рано или поздно Вам с такой  необходимостью придется столкнуться, если уже не пришлось, раз читаете эту статью. К счастью, в C# генератор случайных чисел разработан до нас, и единственное что нам нужно будет, большинстве случаев, это просто правильно им пользоваться. И так, для генерации случайных чисел в программах, написанных на C#, предназначен класс «Random».

  //Создание объекта для генерации чисел  Random rnd = new Random();    //Получить очередное (в данном случае - первое) случайное число  int value = rnd.Next();    //Вывод полученного числа в консоль  Console.WriteLine(value);  

Как видите — ничего сложного! Сначала создаем объект типа «Random», потом вызываем его метод «Next», в результате чего и получаем случайное число. Если мы вызовем метод «Next» несколько раз, то получим разные числа. Такой код, даст нам четыре разных, случайных числа:

  //Создание объекта для генерации чисел  Random rnd = new Random();     int value = rnd.Next(); //Получить очередное случайное число  int value1 = rnd.Next(); //Получить очередное случайное число  int value2 = rnd.Next(); //Получить очередное случайное число  int value3 = rnd.Next(); //Получить очередное случайное число     Console.WriteLine(value); //Вывод числа в консоль  Console.WriteLine(value1); //Вывод числа в консоль  Console.WriteLine(value2); //Вывод числа в консоль  Console.WriteLine(value3); //Вывод числа в консоль  

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

  //Создание объекта для генерации чисел  Random rnd = new Random();    //Получить случайное число (в диапазоне от 0 до 10)  int value = rnd.Next(0, 10);    //Вывод числа в консоль  Console.WriteLine(value);   

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

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

Но это ещё не всё, есть еще один важный нюанс, на самом деле генератор случайных чисел является генератором псевдослучайных чисел, т.е. числа, которые он возвращает, не являются чисто случайными, они «вырабатываются» по определенным и четким законам, а «случайность» зависит от инициализации объекта, который генерирует числа (объекта класса «Random»). В примерах, приведенных выше, мы использовали конструктор по умолчанию, и в таком случае (судя по всему), «начальное значение» задается системой, и на основании системного времени. Но мы может задавать это самое «начальное значение» и сами:

  //Создание объекта для генерации чисел (с указанием начального значения)  Random rnd = new Random(245);    //Получить случайное число   int value = rnd.Next();  

Только  обратите внимание, начальное значение используется для генерации чисел, а не для возвращения первого числа, т.е. первое сгенерированное число не будет тем, что указано при создании объекта.

Так вот если два (или более) разных объекта класса «Random» будут одинаково проинициализированы, то и возвращать они будут одни и те же числа, например, следующий код,  выведет в консоль три одинаковых числа:

  class Program  {   //Этот метод должен возвращать случайное значение   static int GetRandom()   {   //Создание объекта для генерации чисел (с указанием начального значения)   Random rnd = new Random(245);     //Получить случайное число    int value = rnd.Next();     //Вернуть полученное значение   return value;   }     static void Main(string[] args)   {    //Вывод сгенерированных чисел в консоль   Console.WriteLine(GetRandom());   Console.WriteLine(GetRandom());   Console.WriteLine(GetRandom());   }  }  

Как видите, не смотря на то, что в при каждом вызове метода «GetRandom» создается новый объект для генерации случайных чисел, инициализируются эти объекты одним и тем же значением. Так что, будьте внимательны!

plssite.ru

The question looks very simple but the answer is bit complicated. If you see almost everyone has suggested to use the Random class and some have suggested to use the RNG crypto class. But then when to choose what.

For that we need to first understand the term RANDOMNESS and the philosophy behind it.

I would encourage you to watch this video which goes in depth in the philosophy of RANDOMNESS using C# https://www.youtube.com/watch?v=tCYxc-2-3fY

First thing let us understand the philosophy of RANDOMNESS. When we tell a person to choose between RED, GREEN and YELLOW what happens internally. What makes a person choose RED or YELLOW or GREEN?

c# Random

Some initial thought goes into the persons mind which decides his choice, it can be favorite color , lucky color and so on. In other words some initial trigger which we term in RANDOM as SEED.This SEED is the beginning point, the trigger which instigates him to select the RANDOM value.

Now if a SEED is easy to guess then those kind of random numbers are termed as PSEUDO and when a seed is difficult to guess those random numbers are termed SECURED random numbers.

For example a person chooses is color depending on weather and sound combination then it would be difficult to guess the initial seed.

c# Random

Now let me make an important statement:-

*“Random” class generates only PSEUDO random number and to generate SECURE random number we need to use “RNGCryptoServiceProvider” class.

c# Random

Random class takes seed values from your CPU clock which is very much predictable. So in other words RANDOM class of C# generates pseudo random numbers , below is the code for the same.

Random rnd= new Random(); int rndnumber = rnd.Next() 

While the RNGCryptoServiceProvider class uses OS entropy to generate seeds. OS entropy is a random value which is generated using sound , mouse click and keyboard timings , thermal temp etc. Below goes the code for the same.

using (RNGCryptoServiceProvider rg = new RNGCryptoServiceProvider())  {   byte[] rno = new byte[5];   rg.GetBytes(rno);   int randomvalue = BitConverter.ToInt32(rno, 0);  } 

To understand OS entropy see this video from 14:30 https://www.youtube.com/watch?v=tCYxc-2-3fY where the logic of OS entropy is explained. So putting in simple words RNG Crypto generates SECURE random numbers.

stackoverflow.com


You May Also Like

About the Author: admind

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

Adblock
detector