#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. Вчера отсутствовал. Спасибо всем, кто предложил информацию, чтобы помочь. Я смогу сесть и полностью рассмотреть предложения, предложенные в эти выходные. Спасибо всем за ваши мысли.