2012-10-11 5 views
1

Je suis en train de créer LNGS Lat/aléatoire à l'intérieur d'un cadre de sélection. Le code ci-dessous crée Lat/LNGS et ils complotent sur la carte ... et alors qu'ils sont dans le bon pays, ils ne sont pas dans le droit « boîte »Créer un ensemble aléatoire de LatLng dans un BoundingBox

ma boîte englobante ressemble à ceci:

top_left = 51.514881121099904, -0.1293877362387679 
bottom_right = 51.492151803709525, -0.09693947143827275 

minLat = 51.514881121099904 
maxLat = 51.492151803709525 
minLng = -0.09693947143827275 
maxLng = -0.1293877362387679 

Mon code ressemble à ceci:

markers = [] 

10.times do 
    x = minLat + rand(maxLat - minLat) 
    y = minLng + rand(maxLng - minLng) 
    latLng = [x,y] 
    markers << latLng 
end 

markers.each do |x| 
    puts "#{x[0]} , #{x[1]}" 
end 

Mais ce ne est pas sortie le droit lat/LNGS. Y a-t-il quelque chose que je fais de mal? Est-ce que je regarde cela de la mauvaise façon?

Par exemple, une des sorties d'exécution:

51.51778835694538 , 0.8479098023328967 
51.56834519895925 , 0.70003581382595 
52.47933844269927 , 0.6167209565236026 
51.52116824209034 , 0.8997051592766233 
52.26830135905681 , 0.7514635122980192 
52.143607260212896 , 0.21838042686322268 
52.04649651836466 , 0.6683244476203801 
52.057410769358576 , -0.08734906181439461 
52.053408170846915 , 0.1600069328435182 
51.8991829618331 , 0.3993135670912452 

Mais clairement 52.26830135905681 n'est pas entre min et max lat ... donc je suis un peu confus

Est-ce que rand() faire une sorte ou d'arrondi en haut Peut-il fonctionner sur de tels flotteurs?

+1

cela fonctionne très bien pour moi. –

+0

hmmm ... quand je les tracer sur une carte, ils ont tort –

Répondre

3

Comment est rand() défini? Ne me souviens pas du haut de ma tête ...

Vous pouvez utiliser la classe aléatoire de rubis (http://www.ruby-doc.org/core-1.9.3/Random.html) et faire quelque chose comme ceci:

rng = Random.new(seed) 
lat = minLat + rng.rand * (maxLat - minLat) 
lng = minLng + rng.rand * (maxLng - minLng) 
+0

excellent celui-ci a travaillé, sur le flotteur bizarre! –

+0

Simple et fait le travail. Merci. – dimitarvp

0

rand utilise to_i.abs sur son argument. Mieux utiliser rand(minLat..maxLat). En outre, dans votre code il semble que les valeurs minimales et maximales sont mélangées.

maxLat = 51.514881121099904 
minLat = 51.492151803709525 
maxLng = -0.09693947143827275 
minLng = -0.1293877362387679 
markers = [] 

10.times do 
    markers << [rand(minLat..maxLat), rand(minLng..maxLng)] 
end 

markers.each do |lat, lng| 
    puts "#{lat} , #{lng}" 
end 
+0

Oh, je ne savais pas que vous pouviez faire des gammes avec des flotteurs! Apprendre quelque chose de nouveau chaque jour à propos de Ruby, hehe – nan

+0

@nan Vous ne pouvez pas itérer sur eux, mais la méthode rand semble parfaitement heureux :) – steenslag

+0

ce gars est génial, merci! –

Questions connexes