Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

318
Vistas
Cómo usar rand() para números grandes

¿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

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Aclaremos algunos puntos de confusión:

  • Los enteros nativos de PHP tienen un máximo de 2 elevado a 63, porque se almacenan en 64 bits de memoria, y el bit 64 se usa para números negativos (estoy simplificando un poco). No importa dónde lo coloque en el código fuente, un número mayor que ese simplemente no puede existir como un número entero de PHP, ni siquiera brevemente.
  • GMP es una biblioteca que almacena números de una manera diferente y puede representar números mayores que eso. Pero no puede ver lo que pones en el código fuente, tienes que pasarle algún otro valor que PHP pueda representar, razón por la cual las funciones GMP aceptan tanto cadenas como enteros.
  • Las funciones normales de PHP no conocen GMP: no puede pasar un objeto de número GMP a funciones matemáticas normales u otras funciones, debe usar las funciones en la biblioteca GMP. (Hay una excepción, que es que puede usar operadores como + y * con objetos GMP, y PHP llama a la función apropiada para usted).

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:

  • Números enteros, que no son buenos en nuestro caso, porque no podemos crear números enteros lo suficientemente grandes
  • Objetos GMP, como los que creó con gmp_init
  • Cadenas, como las que usó para crear los objetos GMP

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.

over 4 years ago · Santiago Trujillo Denunciar

0

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);
over 4 years ago · Santiago Trujillo Denunciar

0

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.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda