PHP aleatorio: excluir / incluir / flotar / negativos y otros animales

Necesito generar pares aleatorios de números (flotantes), dentro de un cierto rango. Básicamente, esos son puntos para pares [Lat, Lng] (Longitud - coordenadas de latitud)

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 cuántos números después del punto flotante (resolución), que necesito arreglar.

Así que la siguiente fase fue:

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

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

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

pero bueno, las coordenadas son de -90 a 90 (lon) y de -180 a 180 (lan), ¿qué pasa con el signo menos?

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

eso debería hacerlo ... y combinar todo junto debería darme de alguna manera una cadena aleatoria como

23.0239423525 || -135.937419777

así que después de toda esta introducción - aquí is Son mis preguntas.

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

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

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

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

Sé que estas son muchas preguntas, ¡pero cualquier ayuda / pensamiento sería genial! (y si la primera se responde positivamente, el resto casi se puede ignorar :-)

preguntado el 10 de marzo de 12 a las 12:03

1 Respuestas

La función rand() puede tomar un minuto negativo, así que tal vez puedas 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, es posible que deba hacerlo en dos pasos. Primero considere los rangos que desea. Digamos que tiene 3 rangos a partir de los cuales desea generar el número aleatorio. rango 1 = -180 a -10, rango 2 = 10 - 100 y rango 3 = 120 - 180. Luego puede generar un número aleatorio del 1 al 3 inclusive, utilícelo para elegir un rango y luego generar el número en ese rango .

respondido 10 mar '12, 12:03

Hola, gracias. Su código es obviamente más elegante y eficiente que el mío. No conocía el number_format() - pero, ¿cómo puedo EXCLUIR un rango de la función aleatoria (la otra parte de la pregunta ...) - Obmerk Kronen

gracias, el punto es que necesito excluir un rango ESPECÍFICO de RANDOM, y no RANDOM de RANDOM, solo para darle un ejemplo, digamos que necesito generar coordenadas mundiales pero EXCLUIR todas las coordenadas que son, por ejemplo "Corea del Norte" o "desiertos", así que tengo ese conjunto de coordenadas, ¿cómo puedo excluir esos rangos? ¿Usar matriz 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 tanto, creo que un RANGO es mi única opción. pero como exactamente - Obmerk Kronen

Lo que sugiero es que es posible que desee excluir un rango, pero eso deja dos rangos que desea incluir. O si desea excluir dos rangos, entonces está incluyendo 3 rangos... y así sucesivamente. Sé que la cantidad de rangos puede ser alta, si desea excluir n rangos, en realidad está incluyendo n + 1 rangos. Dado que el valor aleatorio puede ocurrir en cualquiera de los n+1 rangos, debe seleccionar aleatoriamente uno de ellos. Luego seleccione aleatoriamente el valor dentro del rango seleccionado. - Vicente Ramdhanie

ok .. voy a ir a probar . gracias por tu tiempo ! Solo quería estar seguro de que no hay forma en PHP aleatorio (u otra función desconocida para mí) de excluir/incluir variables (rangos de lectura) de otro rango... gracias de nuevo. - Obmerk Kronen

por supuesto, en su situación, la respuesta es mucho más compleja ya que desea dos valores aleatorios que de alguna manera deben corresponder a un rango válido. Si está buscando un lugar aleatorio en un mundo 2d, es posible que desee considerar algunos algoritmos geométricos que pueden simplificar su vida. - Vicente Ramdhanie

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.