mt_rand

(PHP 4, PHP 5)

mt_randГенерирует случайное значение методом mt

Описание

int mt_rand ( void )
int mt_rand ( int $min , int $max )

Многие генераторы случайных чисел в старых библиотеках имеют сомнительные или неизвестные характеристики, а также работают довольно медленно. По умолчанию, PHP использует генератор случайных чисел libc с помощью функции rand(). Функция mt_rand() представляет собой удобную замену этой функции. Она использует генератор случайных чисел с известными характеристиками, основанный на "» Вихре Мерсенна", который генерирует случайные числа в среднем в четыре раза быстрее, чем libc rand().

Вызванная без необязательных параметров min и max, функция mt_rand() возвращает псевдослучайное значение между 0 и mt_getrandmax(). Если вам нужно, например, случайное число между 5 и 15 (включительно), используйте вызов mt_rand(5,15)

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

min

Необязательный параметр: минимальное значение случайного числа (по умолчанию: 0)

max

Необязательный параметр: максимальное значение случайного числа (по умолчанию: mt_getrandmax())

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

Случайное целое значение между min (или 0) и max (или mt_getrandmax(), включительно)

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

Версия Описание
4.2.0Генератор случайных чисел инициализируется автоматически.

Примеры

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

<?php
echo mt_rand() . "\n";
echo 
mt_rand() . "\n";

echo 
mt_rand(515);
?>

Результатом выполнения данного примера будет что-то подобное:

1604716014
1478613278
6

Примечания

Предостережение

Распределение значений, возвращаемых mt_rand(), отдает предпочтение четным числам на 64-битных сборках PHP, если параметр max больше 2^32.

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

  • mt_srand() - Переинициализирует генератор случайных чисел mt
  • mt_getrandmax() - Показывает максимально возможное значение случайного числа
  • rand() - Генерирует случайное число

Коментарии

<?php
//
// Generates a random string with the specified length
// Chars are chosen from the provided [optional] list
//
function simpleRandString($length=16$list="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"){
   
mt_srand((double)microtime()*1000000);
   
$newstring="";

    if(
$length>0){
        while(
strlen($newstring)<$length){
           
$newstring.=$list[mt_rand(0strlen($list)-1)];
        }
    }
    return 
$newstring;
}

//
// Generates a random string with the specified length
// Includes: a-z, A-Z y 0-9
//
function randString($length=16) {
   
$newstring="";
   if(
$length>0) {
       while(
strlen($newstring)<$length) {
           
$randnum mt_rand(0,61);
           if (
$randnum 10) {
               
$newstring.=chr($randnum+48);
           } elseif (
$randnum 36) {
               
$newstring.=chr($randnum+55);
           } else {
               
$newstring.=chr($randnum+61);
           }
       }
   }
   return 
$newstring;
}
?>
2002-03-02 14:38:23
http://php5.kiev.ua/manual/ru/function.mt-rand.html
Автор:
Here is a example of a very small, compact, quite random-random string generator. It will make a string with uppercase & lowercase letters, with numbers. You simply need to set $len in the for() structure, and then the string will be in $r.  It has been designed for size, while it's still quite fast.  Mind the wrapping, it should be 1 line.

<?php 
for($len=8,$r='';strlen($r)<$len;$r.=chr(!mt_rand(0,2)?
mt_rand(48,57):(!mt_rand(0,1)?mt_rand(65,90):mt_rand
(97,122))));
?>

Armond Carroll
2004-02-11 07:27:45
http://php5.kiev.ua/manual/ru/function.mt-rand.html
Allows characters 0-9, a-z
Weighted (and tested) ok.

<?php
function generate_string ($length 20)
{
   
$nps "";
    for(
$i=0;$i<$length;$i++)
    {
       
$nps .= chr( (mt_rand(136) <= 26) ? mt_rand(97122) : mt_rand(4857 ));
    }
    return 
$nps;
}
?>
2005-04-16 05:46:32
http://php5.kiev.ua/manual/ru/function.mt-rand.html
a better (and likely faster) way to generate a random 6-digit hex string:

<?php
$num 
mt_rand 00xffffff ); // trust the library, love the library...
$output sprintf "%06x" $num ); // muchas smoochas to you, PHP!
return $output;
?>

The mt_rand function won't give you a number outside the bounds you asked for -- no need to and-off the top bits -- and the sprintf function has params for length-padding & hexidecimal output.  It's likely faster because most of the work is being done by the wicked fast C functions that PHP sits on top of, though YMMV in that dept.
2007-02-08 00:44:38
http://php5.kiev.ua/manual/ru/function.mt-rand.html
The algorithm used by mt_rand() changed in PHP 5.2.1. If you are relying on getting the same sequence from mt_rand() after calling mt_srand() with a known seed, upgrading to PHP 5.2.1 will break your code. See http://bugs.php.net/bug.php?id=40724 for something of an explanation; there is no workaround.
2007-03-21 11:18:58
http://php5.kiev.ua/manual/ru/function.mt-rand.html
mt_rand function returns just a whole numbers. If you want a random float, then here's an elegant way:

<?php
function random_float ($min,$max) {
   return (
$min+lcg_value()*(abs($max-$min)));
}
?>
2007-06-16 03:42:49
http://php5.kiev.ua/manual/ru/function.mt-rand.html
Автор:
performance: for a repetitive task, it's much faster not to use the limit parameters, as shown below. just use the % operator.

$t=microtime(true);
for($i=0;$i<1000000;$i++)
 mt_rand()%3;
echo microtime(true)-$t;

echo '|';

$t=microtime(true);
for($i=0;$i<1000000;$i++)
 mt_rand(0,2);
echo microtime(true)-$t;

echo '|';

$t=microtime(true);
for($i=0;$i<1000000;$i++)
 mt_rand();
echo microtime(true)-$t;

output: 0.316797971725|0.442242145538|0.253082036972
2007-11-13 08:42:35
http://php5.kiev.ua/manual/ru/function.mt-rand.html
mt_rand() is not faster than rand() !

Tested over 100'000 iterations, with none/various/random arguments, mt_rand is always 3% slower than rand().
2008-03-29 06:01:22
http://php5.kiev.ua/manual/ru/function.mt-rand.html
Автор:
If you need some pseudorandom bits for security or cryptographic purposes (e.g.g., random IV for block cipher, random salt for password hash) mt_rand() is a poor source.  On most Unix/Linux and/or MS-Windows platforms you can get a better grade of pseudorandom bits from the OS or system library, like this:

<?php
// get 128 pseudorandom bits in a string of 16 bytes

$pr_bits '';

// Unix/Linux platform?
$fp = @fopen('/dev/urandom','rb');
if (
$fp !== FALSE) {
   
$pr_bits .= @fread($fp,16);
    @
fclose($fp);
}

// MS-Windows platform?
if (@class_exists('COM')) {
   
// http://msdn.microsoft.com/en-us/library/aa388176(VS.85).aspx
   
try {
       
$CAPI_Util = new COM('CAPICOM.Utilities.1');
       
$pr_bits .= $CAPI_Util->GetRandom(16,0);

       
// if we ask for binary data PHP munges it, so we
        // request base64 return value.  We squeeze out the
        // redundancy and useless ==CRLF by hashing...
       
if ($pr_bits) { $pr_bits md5($pr_bits,TRUE); }
    } catch (
Exception $ex) {
       
// echo 'Exception: ' . $ex->getMessage();
   
}
}

if (
strlen($pr_bits) < 16) {
   
// do something to warn system owner that
    // pseudorandom generator is missing
}
?>

NB: it is generally safe to leave both the attempt to read /dev/urandom and the attempt to access CAPICOM in your code, though each will fail silently on the other's platform.  Leave them both there so your code will be more portable.
2008-06-06 02:31:15
http://php5.kiev.ua/manual/ru/function.mt-rand.html
just another example: both of these routines return a random decimal number between -1 and 1... since rand() only returns a max 'integer' value while mt_rand() return a max 'long' value -- at least on some platforms -- mt_rand() could be the better precision choice for some on any variation to this routine (but i don't think it matters here):

<?php
echo "-1 to 1 rand() value: ". (rand(getrandmax()*-1,getrandmax())/getrandmax()). "\n<br/>";
echo 
"-1 to 1 mt_rand() value: ". (mt_rand(mt_getrandmax()*-1,mt_getrandmax())/mt_getrandmax()). "\n";
?>
2009-02-19 11:13:51
http://php5.kiev.ua/manual/ru/function.mt-rand.html
A class to generate 99.5% unqiue strings. I found that there is only one or two characters common between two subsequent strings.

<?php

class Local_RandomString {
 
  protected 
$_length;
  protected 
$_prevRand;

  public function 
__construct($length 15) {
   
   
$this->_length $length;

  }

  public function 
getRand() {
   
   
$randStr null;   
   
$args[] = 'N' $this->_length;

    for(
$i 0$i $this->_length$i++) {
     
$args[] = mt_rand();     
    }
   
   
$randStr substr(base64_encode((call_user_func_array('pack'$args))), 1$this->_length);
   
$this->_prevRand $randStr;
    return 
$randStr;

  }

  public function 
setLength($l) {
   
   
$this->_length = (int) $l;
   
    if(
$this->_length <= 0) {
      throw new 
Exception('Invalid random string length');
    }

  }

  public function 
getPrevRand() {
   
    return 
$this->_prevRand;

  }

}
?>
2010-05-19 03:20:45
http://php5.kiev.ua/manual/ru/function.mt-rand.html
Автор:
Fast, pseudo-random binary data generation using mt_rand():

<?php

function rnd_bin$length )
{
    while( @
$c++ * 16 $length )
        @
$tmp .= md5mt_rand(), true );
    return 
substr$tmp0$length );
}

?>
2010-12-25 08:14:01
http://php5.kiev.ua/manual/ru/function.mt-rand.html
Another good way to get a random float is to divide the result of mt_rand.
Let's say we want a float between 0.75 and 1.25.

<?php

$i 
mt_rand(75,125) / 100;

?>
2011-09-02 14:12:52
http://php5.kiev.ua/manual/ru/function.mt-rand.html
To quickly build a human-readable random string for a captcha per example :

<?php

function random($length 8)
{     
   
$chars 'bcdfghjklmnprstvwxzaeiou';
   
    for (
$p 0$p $length$p++)
    {
       
$result .= ($p%2) ? $chars[mt_rand(1923)] : $chars[mt_rand(018)];
    }
   
    return 
$result;
}

?>

Note that I have removed q and y from $chars to avoid readability problems.
2011-11-24 06:43:22
http://php5.kiev.ua/manual/ru/function.mt-rand.html
i wanted to spot out the big difference between rand and mt_rand when producing images using randomness as noise.

for example this is a comparation between rand and mt_rand on a 400x400 pixel png: http://oi43.tinypic.com/vwtppl.jpg

code:
<?php
header
("Content-type: image/png");
$sizex=800;
$sizey=400;

$img imagecreatetruecolor($sizex,$sizey);
$ink imagecolorallocate($img,255,255,255);

for(
$i=0;$i<$sizex/2;$i++) {
  for(
$j=0;$j<$sizey;$j++) {
 
imagesetpixel($imgrand(1,$sizex/2), rand(1,$sizey), $ink);
  }
}
 
for(
$i=$sizex/2;$i<$sizex;$i++) {
  for(
$j=0;$j<$sizey;$j++) {
 
imagesetpixel($imgmt_rand($sizex/2,$sizex), mt_rand(1,$sizey), $ink);
  }
}

imagepng($img);
imagedestroy($img);
?>

the differences reduce when reducing the pixels of the image.. infact for a 100x100 pixel image the noise produced from the rand function is much more realistic than how it is for a 400x400 image: http://oi39.tinypic.com/5k0row.jpg

(rand is on the left, mt_rand on the right)
2012-03-01 10:44:27
http://php5.kiev.ua/manual/ru/function.mt-rand.html
Автор:
Another graphical comparison of rand() and mt_rand(). It effectively draws a graph showing how the last generated number affects the next by plotting the numbers in consecutive pairs against each other.

<?php
header
("Content-type: image/png");
$sizex=800;
$sizey=800;

$img imagecreatetruecolor($sizex,$sizey);
$black imagecolorallocate($img,000);
imagefilledrectangle($img00$sizex$sizeyimagecolorallocate($img255255255));

$p 0;
for(
$i=0$i 100000$i++) {
   
$np rand(0,$sizex);
   
imagesetpixel($img$p$np$black);
   
$p $np;
}

$p 0;
for(
$i=0$i 100000$i++) {
   
$np mt_rand(0,$sizex);
   
imagesetpixel($img$p $sizex$np$black);
   
$p $np;
}

imagepng($img);
imagedestroy($img);
?>
2013-01-30 00:56:42
http://php5.kiev.ua/manual/ru/function.mt-rand.html
Автор:
Another generic random string function, but very small and fast.

<?php
function mt_rand_str ($l$c 'abcdefghijklmnopqrstuvwxyz1234567890') {
    for (
$s ''$cl strlen($c)-1$i 0$i $l$s .= $c[mt_rand(0$cl)], ++$i);
    return 
$s;
}

echo 
mt_rand_str(8); // Something like mp2tmpsw
echo mt_rand_str(6'0123456789ABCDEF'); // Something like B9CD0F
?>
2013-08-02 21:05:21
http://php5.kiev.ua/manual/ru/function.mt-rand.html
Автор:
To reiterate the message about *not* using mt_rand() for anything security related, here's a new tool that has been just posted that recovers the seed value given a single mt_rand() output:

http://www.openwall.com/php_mt_seed/README
2013-11-05 13:13:32
http://php5.kiev.ua/manual/ru/function.mt-rand.html
I wrote another function to get a random float, if its not precise enougth jut add some '0' to the $mul parameter.

<?php

function f_rand($min=0,$max=1,$mul=1000000){
    if (
$min>$max) return false;
    return 
mt_rand($min*$mul,$max*$mul)/$mul;
}
?>
I made following  tests:
<?php
   
echo f_rand()."<br>";              //0.497153
   
echo f_rand(0.5)."<br>";           //0.857822
   
echo f_rand(0.5,0.6)."<br>";       //0.599956
   
echo f_rand(0,10)."<br>";          //5.801949
   
echo f_rand(0,2,2)."<br>";         //1.5
   
echo f_rand(0,2,10)."<br>";        //1.7
?>
2014-07-12 18:34:09
http://php5.kiev.ua/manual/ru/function.mt-rand.html
Автор:
With PHP 5.3.3, we're seeing odd behavior on 32 bit Linux.

This works fine on 64 bit Linux: 
<?php
printf 
("%08x\n"mt_rand (00xFFFFFFFF));
?>
but on our 32 bit Linux development server, it's always yielding "00000000". 

On that same machine, this: 
<?php
printf 
("%08x\n"mt_rand (00xFFFFFFF0));
?> 
seems to always yield either 00000000 or a number in the range fffffff2 to ffffffff. This: 
<?php
printf 
("%08x\n"mt_rand (00xFFFFFF00));
?> 
gives numbers where the last two digits vary, and so on through at least 0xF0000000. 

However, this: 
<?php
printf 
("%08x\n"mt_rand (00x7FFFFFFF));
?>
seems to be well-behaved.

The moral? On 32 bit systems, be careful about crossing the signed number boundary, 0x7FFFFFFF.
2014-09-13 01:12:49
http://php5.kiev.ua/manual/ru/function.mt-rand.html
Автор:
mt_rand is not calculated by Mersenne Twister.

https://github.com/php/php-src/commit/a0724d30817600540946b41e40f4cfc2a0c30f80
2016-02-19 19:18:08
http://php5.kiev.ua/manual/ru/function.mt-rand.html
rand() comes from the libc, and mt_rand() is internal to PHP. So the differences vary with their respective versions.

On a 64b Debian Stretch with PHP 5.6.21, there is no visible difference: http://oi64.tinypic.com/2nkqas6.jpg

This image compares the two functions. In the top half with random points, in the lower half with random intensity on each point. This is totally different from what was obtained 4 years ago in another note, with an unknown environment.

Here is the code for this visual comparison.
<?php
$sizex 
400;
$sizey 400;

$img imagecreatetruecolor($sizex$sizey);
$white imagecolorallocate($img255255255);
$inks array_map(
    function(
$r) use($img) { return imagecolorallocate($img$r$r$r); },
   
range(0255)
);
for (
$x $x $sizex $x++) {
    for (
$y $y $sizey $y++) {
       
// placing ($sizex x $sizey) white points at random in the top half
       
imagesetpixel($imgrand(0$sizex 1), rand(0$sizey 1), $white);
       
imagesetpixel($img$sizex mt_rand(0$sizex 1), mt_rand(0$sizey 1), $white);
       
// random intensity for each point in the lower half
       
imagesetpixel($img$x$sizey $y$inks[rand(0255)]);
       
imagesetpixel($img$sizex $x$sizey $y$inks[mt_rand(0255)]);
    }
}
header("Content-type: image/png");
imagepng($img);
?>
2016-06-03 13:49:22
http://php5.kiev.ua/manual/ru/function.mt-rand.html
Автор:
The seed is the PID + LCG (https://github.com/php/php-src/search?q=GENERATE_SEED&unscoped_q=GENERATE_SEED)
2018-12-20 10:24:09
http://php5.kiev.ua/manual/ru/function.mt-rand.html
Автор:
A nifty function to generate pretty coupon codes. This will generate unique coupon codes and you don't have to do a database check whether the code already exists.

<?php
function giftCodes(){
   
$a='';
    for(
$j=0$j<=4$j++){
       
$c 4;
        if(
$j == 1) { $a .= date("d"); $c=2; }
        if(
$j == 3) { $a .= date("m"); $c=2; }
        if(
$j == 4) { $a .= date("y"); $c=2; }
        for(
$i=0$i<= $c$i++)
           
$a .= chr(!mt_rand(0,2)?mt_rand(48,57):mt_rand(65,90));
       
$a .='-';
    }
    return 
substr($a0, -1);
}
?>
2020-02-03 07:19:49
http://php5.kiev.ua/manual/ru/function.mt-rand.html

    Поддержать сайт на родительском проекте КГБ