number - php número de dígito aleatorio x
random number php no repeat (15)
Necesito crear un número al azar con x cantidad de dígitos.
Digamos que x es 5, necesito un número para ser, por ej. 35562 Si x es 3, arrojaría algo así como; 463
¿Podría alguien mostrarme cómo se hace esto?
Aquí hay una solución simple sin bucles ni problemas que le permitirá crear cadenas aleatorias con caracteres, números o incluso con símbolos especiales.
$randomNum = substr(str_shuffle("0123456789"), 0, $x);
donde $x
puede ser una cantidad de dígitos
P.ej. substr(str_shuffle("0123456789"), 0, 5);
Resultados después de un par de ejecuciones
98450
79324
23017
04317
26479
Puedes usar el mismo código para generar cadenas aleatorias también, como esta
$randomNum=substr(str_shuffle("0123456789abcdefghijklmnopqrstvwxyzABCDEFGHIJKLMNOPQRSTVWXYZ"), 0, $x);
Resultados con $x = 11
FgHmqpTR3Ox
O9BsNgcPJDb
1v8Aw5b6H7f
haH40dmAxZf
0EpvHL5lTKr
Esta es otra solución simple para generar números aleatorios de N dígitos:
$number_of_digits = 10;
echo substr(number_format(time() * mt_rand(),0,'''',''''),0,$number_of_digits);
Verifíquelo aquí: http://codepad.org/pyVvNiof
Puede usar rand($min, $max)
para ese propósito exacto.
Para limitar los valores a valores con x dígitos, puede usar lo siguiente:
$x = 3; // Amount of digits
$min = pow(10,$x);
$max = pow(10,$x+1)-1);
$value = rand($min, $max);
Trate su número como una lista de dígitos y añada un dígito al azar cada vez:
function n_digit_random($digits) {
$temp = "";
for ($i = 0; $i < $digits; $i++) {
$temp .= rand(0, 9);
}
return (int)$temp;
}
O una solución puramente numérica:
function n_digit_random($digits)
return rand(pow(10, $digits - 1) - 1, pow(10, $digits) - 1);
}
a tu gente realmente le gusta complicar las cosas :)
el verdadero problema es que el OP quiere, probablemente, agregar eso al final de un número realmente grande. si no, no hay necesidad de que pueda ser requerido. como ceros a la izquierda en cualquier número es simplemente, bueno, dejó ceros.
entonces, solo agregue la porción más grande de ese número como una suma matemática, no como una cadena.
p.ej
$x = "102384129" . complex_3_digit_random_string();
simplemente se convierte
$x = 102384129000 + rand(0, 999);
hecho.
este simple script hará
$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;
hazlo con un bucle:
function randomWithLength($length){
$number = '''';
for ($i = 0; $i < $length; $i++){
$number .= rand(0,9);
}
return (int)$number;
}
la forma más simple que puedo pensar es usando la función rand
con str_pad
<?php
echo str_pad(rand(0,999), 5, "0", STR_PAD_LEFT);
?>
En el ejemplo anterior, generará un número aleatorio en el rango de 0 a 999 .
Y teniendo 5 dígitos.
rand(1000, 9999);
funciona más rápido que x4 veces rand(0,9);
punto de referencia:
rand(1000, 9999) : 0.147 sec.
rand(0,9)x4 times : 0.547 sec.
Ambas funciones se ejecutaban en 100000 iteraciones para que los resultados fueran más explícitos
rand
o mt_rand
va a hacer ...
uso:
rand(min, max);
mt_rand(min, max);
Puede usar rand()
junto con pow()
para que esto suceda:
$digits = 3;
echo rand(pow(10, $digits-1), pow(10, $digits)-1);
Esto dará como resultado un número entre 100 y 999. Esto porque 10 ^ 2 = 100 y 10 ^ 3 = 1000 y luego necesita restarlo con uno para obtenerlo en el rango deseado.
Si 005 también es un ejemplo válido, usaría el siguiente código para rellenarlo con ceros a la izquierda:
$digits = 3;
echo str_pad(rand(0, pow(10, $digits)-1), $digits, ''0'', STR_PAD_LEFT);
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;
// -------------------------------------------------------------------
}
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 random_numbers($digits) {
$min = pow(10, $digits - 1);
$max = pow(10, $digits) - 1;
return mt_rand($min, $max);
}
Probado here .