Visual Basic — случайное число между 2 точками (широта и долгота)

#vb.net #random

#vb.net #Случайный

Вопрос:

Первый постер, давний читатель. Я надеюсь, что кто-нибудь поможет мне разобраться в этом, поскольку я просто озадачен тем, как это сделать, и я знаю, что это должно быть легко. Я пытаюсь использовать Visual Basic (я использую VB2019) для генерации случайных точек GPS между заданной областью.

Я хочу найти случайные значения между:

 latstart 25.761606 and latend 26.676215 -- Latitude
lonstart -80.053995 and lonend-80.053995 -- Longitude
  

Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь использовать примеры кодов для генерации случайных чисел, мои координаты округляются до целых чисел, когда я хочу, чтобы целое число и десятичное число генерировали случайное.

Я пробовал этот простой код до сих пор без успеха:

  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
     Dim random As New Random
     Dim lonstart As Decimal = TextBox1.Text
     Dim lonend As Decimal = TextBox2.Text
     Dim latstart As Decimal = TextBox3.Text
     Dim latend As Decimal = TextBox4.Text

     Dim templon As Decimal
     Dim templat As Decimal


     templon = random.Next(lonstart, lonend)
     templat = random.Next(latend, latstart)

     Label1.Text = templon
     Label2.Text = templat

 End Sub
  

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

Я хотел бы поблагодарить всех, кто заранее предлагает полезные предложения по этой проблеме.

Спасибо,

Ричард

Комментарии:

1. Random.Next() обрабатывает только целые числа (устанавливается Option Strict On перед чем-либо еще). Вы можете использовать Random-.NextDouble() , умножить возвращенное значение double на разницу между этими двумя значениями и добавить результат к меньшему значению. Например, dim result = latstart ((latend - latstart) * rnd.NextDouble()) Объявить случайный объект как поле static ( Shared ), а не внутри обработчика событий.

2. Кстати, похоже, что вы выбираете точки в области, достаточно маленькой и достаточно удаленной от полюсов, чтобы считаться плоской, но если вы собираетесь использовать большие области, вас могут заинтересовать случайные точки на сфере .

3. Для получения дополнительной информации см. раздел Получение значений с плавающей запятой в указанном диапазоне . В частности, раздел, который начинается с «Для генерации случайных чисел с плавающей запятой между двумя произвольными значениями».

Ответ №1:

Вот пример с некоторым дополнительным кодом, чтобы убедиться, что значения в текстовых полях преобразуются в десятичную дробь (но я не проверяю, являются ли они допустимыми значениями широты / длины):

 Private R As New Random

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim lonstart, lonend As Decimal
    Dim latstart, latend As Decimal

    Dim valid As Boolean = True
    If Not Decimal.TryParse(TextBox1.Text, lonstart) Then
        valid = False
    End If
    If valid And Not Decimal.TryParse(TextBox2.Text, lonend) Then
        valid = False
    End If
    If valid And Not Decimal.TryParse(TextBox3.Text, latstart) Then
        valid = False
    End If
    If valid And Not Decimal.TryParse(TextBox4.Text, latend) Then
        valid = False
    End If

    If valid Then
        Dim templon As Decimal = R.NextDouble() * (lonend - lonstart)   lonstart
        Dim templat As Decimal = R.NextDouble() * (latend - latstart)   latstart

        Label1.Text = templon
        Label2.Text = templat
    Else
        MessageBox.Show("Invalid Input!")
    End If
End Sub
  

Комментарии:

1. Вчера отсутствовал. Спасибо всем, кто предложил информацию, чтобы помочь. Я смогу сесть и полностью рассмотреть предложения, предложенные в эти выходные. Спасибо всем за ваши мысли.