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?
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);
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
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);
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);
}
function random_numbers($digits) {
$min = pow(10, $digits - 1);
$max = pow(10, $digits) - 1;
return mt_Rand($min, $max);
}
Testé ici .
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.
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
faites-le en boucle:
function randomWithLength($length){
$number = '';
for ($i = 0; $i < $length; $i++){
$number .= Rand(0,9);
}
return (int)$number;
}
Rand
ou mt_Rand
fera l'affaire ...
usage:
Rand(min, max);
mt_Rand(min, max);
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;
}
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;
// -------------------------------------------------------------------
}
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
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;
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
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é.