PHP случайный - исключая / включает / плавает / негативы и другие животные - PullRequest
5 голосов
/ 10 марта 2012

Мне нужно генерировать случайные пары чисел (с плавающей точкой) в пределах определенного диапазона. В основном это точки для пар [Lat, Lng] (долгота - координаты широты)

Я думал, что это будет очень просто с

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

но это не дало мне контроля над тем, сколько чисел после точки с плавающей точкой (разрешение) - что мне нужно исправить.

Итак, следующий этап был:

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

и это работает. вроде, как бы, что-то вроде .. иногда это приводит к результатам как

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

но эй - координаты от -90 до 90 (долгота) и от -180 до 180 (лан) - как насчет минуса?

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

это должно сделать это ... и объединение всех вместе должно дать мне как-то случайную строку, такую ​​как

23.0239423525 || -135.937419777

так что после всего этого введения - здесь - это Мой вопрос (ы).

  • Будучи новичком, я что-то упустил? Разве в PHP нет встроенной функции для генерации случайных чисел с отрицательным или положительным диапазоном?

  • Почему вышеупомянутая функция иногда поворачивает только разрешение 3,4 или 5, если сказано вернуть 6 (я не применял ABS или ROUND) - есть ли автоматическое округление в php? и если есть, то как этого избежать?

  • Я заметил, что «случайность» не так уж случайна - сгенерированные числа всегда являются более или менее последовательными между диапазонами - близко друг к другу. Является ли PHP random простым, очень-очень-очень быстрым вращающимся счетчиком?

  • как ИСКЛЮЧИТЬ диапазон из этого сгенерированного диапазона ?? (или собственно и массив диапазонов)

Я знаю, что это много вопросов, но любая помощь / мысль была бы отличной! (и если на первый ответ положительно, остальные можно почти игнорировать :-)

1 Ответ

3 голосов
/ 10 марта 2012

Функция rand () может занять минус мин, поэтому, возможно, вы можете сделать это:

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

, если вы хотите 6 знаков после запятой.

С точки зрения исключения диапазона вам, возможно, придется сделать это в два этапа. Сначала рассмотрите диапазоны, которые вы хотите. Допустим, у вас есть 3 диапазона, из которых вы хотите сгенерировать случайное число. диапазон 1 = -180 до -10, диапазон 2 = 10 - 100 и диапазон 3 = 120 - 180. Затем вы можете сгенерировать случайное число от 1 до 3 включительно, используйте его, чтобы выбрать один диапазон, а затем сгенерировать число в этом диапазоне ,

...