Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

315
Views
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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!