2012-03-10 19 views
5

我需要在一定範圍內生成隨機數字對(浮點數)。 基本上這些都是點[緯度,經度]對(經度 - 緯度座標)PHP隨機 - exluding/include /浮動/陰性和其他動物

我認爲這將與

<?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(LON)和-180到180(LAN) - 怎麼樣負?

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

應該這樣做..和一切結合在一起後應使這一切介紹給我莫名其妙隨機字符串像

23.0239423525 || -135.937419777 

- 在這裏 是我的問題(一個或多個)。

  • 作爲我是新手 - 我錯過了什麼?是否沒有內置的函數來生成隨機浮點數在PHP中爲負數到正數範圍?

  • 爲什麼上面的函數有時只會返回分辨率3,4或5,如果它被告知返回6(我沒有應用任何ABS或ROUND) - 在PHP中是否有自動舍入?如果有,如何避免它?

  • 我注意到「隨機」並不是隨機的 - 生成的數字總是或多或少地在一個範圍之間串聯 - 彼此接近。 PHP隨機是一個簡單的非常非常快速的旋轉計數器嗎?

  • 我如何從這個生成的範圍EXCLUDE範圍? (或實際上和一系列的範圍)

我知道這些是很多問題,但任何幫助/想法都會很棒! (如果第一個回答是肯定的,其餘幾乎可以:-)

回答

3

蘭特忽略()函數可以接受一個負分所以也許你可以這樣做:

$num = mt_rand(-180000000, 180000000)/1000000; 
    echo number_format($num, 6); 
如果你想

小數點後6位。

在排除範圍方面,您可能需要分兩步進行。首先考慮你想要的範圍。假設你有3個你想要生成隨機數的範圍。範圍1 = -180到-10,範圍2 = 10 - 100和範圍3 = 120 - 180.然後,您可以生成一個從1到3的隨機數,用它來選擇一個範圍,然後生成該範圍內的數字。

+0

嗨,謝謝你 - 你的代碼顯然更優雅和效率,然後我的 - 我不知道'number_format()' - 但我怎麼能EXCLUDE從隨機函數的範圍(問題的其他部分) – 2012-03-10 13:02:28

+0

Hi @Obmerk Ninenine見我的編輯。 – 2012-03-10 13:03:44

+0

謝謝,我需要從RANDOM中排除SPECIFIC範圍 - 而不是RANDOM中的RANDOM - 只是爲了舉一個例子,讓我們說我需要生成世界座標,但EXCLUDE所有座標都是例如「朝鮮」或「沙漠」 - 所以我有這些協調員,我怎麼能排除這些範圍?使用數組是我唯一的選擇?該數組將是巨大的..(除非我可以以某種方式描述一個封閉的多邊形在PHP ...)因此,範圍是我唯一的選擇,我認爲。但究竟如何? – 2012-03-10 13:48:37