2012-03-10 29 views
5

Necesito generar un par aleatorio de números (flotantes), dentro de un cierto rango. Básicamente esos son puntos para [latitud, la longitud] pares (longitud - latitud coordina)PHP aleatorio - excluir/incluir/flotantes/negativos y otros animales

pensé que esto sería muy sencillo con

<?php echo (rand(0,60).'.'.rand(0,99999999999999).' || '); // yes, a string is ok...?> 

pero no me dio el control sobre la cantidad de números después del punto de flotación (resolución) - que necesito corregir.

Así que la próxima fase fue:

<?php echo (rand(0,60*pow(10,6)))/pow(10,6).' || '; //pow(10,$f) where $ is the resolution ?> 

y esto funciona. especie de .. a veces produce resultados como

22.212346 || 33.134 || 36.870757 || //(rare , but does happen) 

pero bueno - coordenadas son de -90 al 90 (lon) y -180º a 180º (LAN) - ¿qué pasa con el signo menos?

echo (rand(0,-180*pow(10,9)))/pow(10,9).' || '; 

que debe hacerlo .. y la combinación de todos juntos me diera alguna manera una cadena aleatoria como

23.0239423525 || -135.937419777 

así que después de toda esta introducción - aquí es son mi pregunta (s).

  • Siendo el novato que soy, ¿me falta algo? ¿No hay función incorporada para generar flotantes aleatorios con un rango negativo a positivo en PHP?

  • ¿Por qué la función de arriba a veces solo da vuelta a la resolución 3,4 o 5 si se le dice que devuelva 6 (no apliqué ningún ABS o REDONDO)? ¿Hay un redondeo automático en php? y si hay, ¿cómo evitarlo?

  • He notado que el "azar" no es tan aleatorio - los números generados son siempre más o menos series entre un rango - cerca uno del otro. ¿Es el PHP aleatorio un simple contador de rotación muy, muy, muy rápido?

  • ¿cómo EXCLUYO un rango de este rango generado? (o en realidad y un rango de rangos)

Sé que estas son muchas preguntas, pero cualquier ayuda/pensamiento sería genial. (Y si el primero se responde positivamente, el resto puede ser ignorada casi :-)

Respuesta

3

El rand() función puede tomar un mínimo negativo así que tal vez usted puede hacer esto:

$num = mt_rand(-180000000, 180000000)/1000000; 
    echo number_format($num, 6); 

si quieres 6 lugares después del punto decimal.

En términos de excluir un rango, puede que tenga que hacerlo en dos pasos. Primero considere los rangos que desea. Digamos que tienes 3 rangos desde los cuales quieres generar el número aleatorio. rango 1 = -180 a -10, rango 2 = 10 - 100 y rango 3 = 120 - 180. Luego puedes generar un número aleatorio de 1 a 3 inclusive, usar eso para elegir un rango y luego generar el número en ese rango .

+0

Hola gracias - su código es obviamente más elegante y eficiente que el mío - No sabía el 'number_format()' - pero cómo puedo EXCLUIR un rango de la función aleatoria (la otra parte de la pregunta ..) –

+0

Hola, @Obmerk Ninenine, mira mi edición. –

+0

gracias, el punto es que necesito excluir un rango ESPECÍFICO desde el ALEATORIO - y no un ALEATORIO desde un ALEATORIO - solo para darle un ejemplo, digamos que necesito generar coordenadas mundiales pero EXCLUIR todas las coordenadas que son para ejemplo "Corea del Norte", o "desiertos" - entonces tengo ese conjunto de coordinaciones ¿cómo puedo excluir esos rangos? usar array es mi única opción? la matriz será enorme ... (a menos que de alguna manera pueda describir un polígono cerrado en php ...), por lo que creo que una RANGE es mi única opción. pero como exactamente? –

Cuestiones relacionadas