web-dev-qa-db-fra.com

php random x chiffre

Je dois créer un nombre aléatoire avec x nombre de chiffres.

Alors disons que x est 5, j'ai besoin d'un nombre pour être par exemple. 35562 Si x est 3, alors il renverrait quelque chose comme; 463

Quelqu'un pourrait-il me montrer comment cela est fait?

51
user1022585

Vous pouvez utiliser Rand() avec pow() pour que cela se produise:

$digits = 3;
echo Rand(pow(10, $digits-1), pow(10, $digits)-1);

Cela donnera un nombre compris entre 100 et 999. Ceci parce que 10 ^ 2 = 100 et 10 ^ 3 = 1000 et vous devez ensuite le soustraire avec un pour le placer dans la plage souhaitée.

Si 005 est également un exemple valide, utilisez le code suivant pour le compléter avec des zéros non significatifs:

$digits = 3;
echo str_pad(Rand(0, pow(10, $digits)-1), $digits, '0', STR_PAD_LEFT);
117
Marcus

J'utilise généralement juste Rand()http://php.net/manual/en/function.Rand.php

par exemple. 

Rand ( 10000 , 99999 );

pour votre nombre aléatoire à 5 chiffres 

20
Code Magician

Vous pouvez utiliser Rand($min, $max) pour ce but précis. 

Afin de limiter les valeurs à des valeurs de x chiffres, vous pouvez utiliser les éléments suivants:

$x = 3; // Amount of digits
$min = pow(10,$x);
$max = pow(10,$x+1)-1);
$value = Rand($min, $max);
13
halfdan

Traitez votre numéro comme une liste de chiffres et ajoutez simplement un chiffre aléatoire à chaque fois:

function n_digit_random($digits) {
  $temp = "";

  for ($i = 0; $i < $digits; $i++) {
    $temp .= Rand(0, 9);
  }

  return (int)$temp;
}

Ou une solution purement numérique:

function n_digit_random($digits)
  return Rand(pow(10, $digits - 1) - 1, pow(10, $digits) - 1);
}
8
Blender
function random_numbers($digits) {
    $min = pow(10, $digits - 1);
    $max = pow(10, $digits) - 1;
    return mt_Rand($min, $max);
}

Testé ici .

7
animuson

le moyen le plus simple auquel je puisse penser est d'utiliser la fonction Rand avec str_pad

<?php
echo str_pad(Rand(0,999), 5, "0", STR_PAD_LEFT);
?>

Dans l'exemple ci-dessus, il générera un nombre aléatoire compris entre 0 et 999 .

Et ayant 5 chiffres.

5
AMB

Rand(1000, 9999); fonctionne plus rapidement que x4 fois Rand(0,9);

référence:

Rand(1000, 9999)      : 0.147 sec.
Rand(0,9)x4 times     : 0.547 sec.

les deux fonctions fonctionnaient dans 100 000 itérations pour rendre les résultats plus explicites

5
Alex

faites-le en boucle:

function randomWithLength($length){

    $number = '';
    for ($i = 0; $i < $length; $i++){
        $number .= Rand(0,9);
    }

    return (int)$number;

}
3
Rene Pot

Rand ou mt_Rand fera l'affaire ...

usage:

Rand(min, max);

mt_Rand(min, max);
3
easyb
function random_number($size = 5)
{
    $random_number='';
    $count=0;
    while ($count < $size ) 
        {
            $random_digit = mt_Rand(0, 9);
            $random_number .= $random_digit;
            $count++;
        }
    return $random_number;  
}
1
philip mudenyo
function Rand_number_available($already_mem_array,$boundary_min,$boundary_max,$digits_num)
{

    $already_mem_array_dim = count($already_mem_array);         // dimension of array, that contain occupied elements

    // --- creating Boundaries and possible Errors
    if( empty($digits_num) ){   
            $boundary_dim = $boundary_max - $boundary_min;
            if($boundary_dim <= 0){
                $error = -1;                                    // Error that might happen. Difference between $boundary_max and $boundary_min must be positive
            }else{
                $error = -2;                                    // Error that might happen. All numbers between, $boundary_min and $boundary_max , are occupied, by $already_mem_array
            }                                   
    }else{
            if($digits_num < 0){                                // Error. If exist, $digits_num must be, 1,2,3 or higher
                $error = -3; 
            }elseif($digits_num == 1){                          // if 'one-figure' number
                $error = -4;                                    // Error that might happen. All 'one-figure' numbers    are occupied, by $already_mem_array
                $boundary_min = 0;
                $boundary_max = 9;
                $boundary_dim = $boundary_max-$boundary_min;
            }elseif($digits_num == 2){                          // if 'two-figure' number
                $error = -5;                                    // Error that might happen. All 'two-figure' numbers    are occupied, by $already_mem_array
                $boundary_min = 10;
                $boundary_max = 99;
                $boundary_dim = $boundary_max-$boundary_min;
            }elseif($digits_num>2){                             // if 'X-figure' number. X>2
                $error = -6;                                    // Error that might happen. All 'X-figure' numbers  are occupied, by $already_mem_array. Unlikely to happen
                $boundary_min = pow(10, $digits_num-1);         // stepenovanje - graduation
                $boundary_max = pow(10, $digits_num)-1;
                $boundary_dim = $boundary_max-$boundary_min;
            }

    }
    // -------------------------------------------------------------------


    // --- creating response ---------------------------------------------
    if( ($already_mem_array_dim <= $boundary_dim)   &&  $boundary_dim>0 ){              // go here only if, there are AVAILABLE numbers to extract, and [difference] $boundary_dim , is positive
        do{
            $num = Rand($boundary_min,$boundary_max);
        }while( in_array($num, $already_mem_array) );
        $result = $num;
    }else{
        $result = $error;                                       // Limit that happened  
    }

    return $result;
    // -------------------------------------------------------------------

}
0
Srx

Voici une autre solution simple pour générer un nombre aléatoire de N chiffres:

$number_of_digits = 10;
echo substr(number_format(time() * mt_Rand(),0,'',''),0,$number_of_digits);

Vérifiez-le ici: http://codepad.org/pyVvNiof

0
MRodrigues

ce script simple fera 

$x = 4;//want number of digits for the random number
$sum = 0;


for($i=0;$i<$x;$i++)
{
    $sum = $sum + Rand(0,9)*pow(10,$i);

}

echo $sum;
0
Susantha7

Cette fonction fonctionne parfaitement sans répétition et le nombre de chiffres souhaité.

$digits = '';
function randomDigits($length){
    $numbers = range(0,9);
    shuffle($numbers);
    for($i = 0; $i < $length; $i++){
        global $digits;
        $digits .= $numbers[$i];
    }
    return $digits;
}

Vous pouvez appeler la fonction et indiquer le nombre de chiffres, par exemple: 

randomDigits(4);

résultats de l'échantillon:

4957 8710 6730 6082 2987 2041 6721

Script original tiré de this Gist

0
Reegan Ochora

Veuillez noter que Rand() ne génère pas de valeur cryptographiquement sécurisée conformément à la documentation:

http://php.net/manual/en/function.Rand.php

Cette fonction ne génère pas de valeurs sécurisées de manière cryptographique et ne doit pas être utilisée à des fins cryptographiques. Si vous avez besoin d'une valeur sécurisée sur le plan cryptographique, utilisez plutôt random_int (), random_bytes () ou openssl_random_pseudo_bytes ().

Il est préférable d'utiliser random_int(), disponible sur PHP 7 (voir: http://php.net/manual/fr/function.random-int.php ).

Donc, pour prolonger la réponse de @ Marcus, vous devriez utiliser:

function generateSecureRandomNumber($digits): int {
   return random_int(pow(10, $digits - 1), pow(10, $digits) - 1);
}

function generateSecureRandomNumberWithPadding($digits): string {
   $randomNumber = random_int(0, pow(10, $digits) - 1);
   return str_pad($randomNumber, $digits, '0', STR_PAD_LEFT);
}

Notez que l'utilisation de Rand() est acceptable si vous n'avez pas besoin d'un nombre aléatoire sécurisé.

0
Yahya Uddin