¿Cómo puedo generar un número que no exceda un rango específico?
Ejemplo:
Quiero generar un número que tenga 70 dígitos pero que no exceda "9000000000000000000000000000000000000000000000000000000000000000000000000"
¿Como hacer eso?
Intenté usar gmp_init
$range1 = gmp_init("100000000000000000000000000000000000000000000000000000000000000000000000000"); $range2 = gmp_init("900000000000000000000000000000000000000000000000000000000000000000000000000"); $generatedValue = rand($range1,$range2); echo $generatedValue;Sin embargo, arroja el siguiente error:
Advertencia de PHP: rand () espera que el parámetro 1 sea int, objeto dado
Probé rand(), mt_rand(), random_byte()...
Otro intento:
<?php $rand1 = gmp_random_range(100000000000000000000000000000000000000000000000000000000000000000000000000,900000000000000000000000000000000000000000000000000000000000000000000000000> echo gmp_strval($rand1) . "\n";Error: Advertencia de PHP: gmp_random_range(): No se puede convertir la variable a GMP - tipo incorrecto en /home/ubuntu/test/test5.php en línea
Aclaremos algunos puntos de confusión:
Teniendo todo eso en cuenta, podemos mirar la lista de funciones GMP en el manual , y encontrar esto :
gmp_random_range(GMP|int|cadena $min, GMP|int|cadena $max): GMP
¡Justo lo que necesitamos! Tenga en cuenta que puede tomar argumentos de tres tipos diferentes:
Así que la forma más sencilla de escribir tu ejemplo es:
$rand1 = gmp_random_range('100000000000000000000000000000000000000000000000000000000000000000000000000','900000000000000000000000000000000000000000000000000000000000000000000000000');Esto devolverá un objeto GMP, por lo que deberá buscar otras funciones GMP para decidir qué hacer con él a continuación.
Los números en php, y la mayoría de los lenguajes de programación, tienen valores máximos y mínimos que no puede superar.
Entero máximo en php definido en PHP_INT_MAX, Flotante máximo definido en PHP_FLOAT_MAX.
Pero si desea una cadena aleatoria más grande que los límites de este número máximo. Puede concatenar cadenas de muchos números aleatorios para obtener esta cadena aleatoria:
$largeRandomString = mt_rand(10000000, 99999999).mt_rand(10000000, 99999999).mt_rand(10000000, 99999999).mt_rand(10000000, 99999999);Esta solución genera una cadena con una longitud fija de 70 caracteres y dígitos espaciados uniformemente del 0 al 9. Solo se requieren funciones básicas de PHP. El algoritmo debe modificarse para sistemas de 32 bits.
$min = "1000000000000000000000000000000000000000000000000000000000000000000000"; $max = '9000000000000000000000000000000000000000000000000000000000000000000000'; do{ for($str = "", $i=0; $i < 7; $i++){ $str .= sprintf("%010d",mt_rand(0,9999999999)); } }while($str < $min OR $str > $max); var_dump($str); //string(70) "8225821562698285549247617814952633507395510882337701683734245940552330"El filtro de rango se basa en una simple comparación de cadenas. Para esto, $min y $max deben contener exactamente 70 caracteres.