Marc Kane Ответов: 3

Получение двойного значения случайного числа


У меня возникли проблемы с получением двойного значения случайного числа. Он всегда возвращается в виде целого числа. Извините, если вопрос слишком тривиален.

Что я уже пробовал:

Public Function GetRandom(ByVal Min As Double, ByVal Max As Double) As Double
        Static Generator As System.Random = New System.Random()
        Return Generator.Next(Min, Max + 1)
    End Function

Dim minA As Double = 100.0
Dim maxA As Double = 255.9
Dim AA As Double
AA = GetRandom(minA, maxA + 1)
MessageBox.Show(AA)

3 Ответов

Рейтинг:
8

Maciej Los

Небольшое улучшение ответа Chill60:

Sub Main
	Dim minA As Double = 100.0
	Dim maxA As Double = 255.9
	
	Dim AA As Double = GetRandom(minA, maxA + 1, GetDecimalPlaces(maxA))
	'example result: 243.6
End Sub

' Define other methods and classes here
Public Function GetRandom(ByVal Min As Double, ByVal Max As Double, ByVal dp As Integer) As Double
        Static Generator As System.Random = New System.Random()
        Dim r As Integer 
        r = Generator.Next(Min * (10 ^ dp) , (Max * (10 ^ dp)) + 1)
        Return r / ( 10 ^ dp)
End Function

'this is new ;)
Public Function GetDecimalPlaces(ByVal n As Decimal) AS Integer
	Dim i As Integer = CInt(Math.Abs(n))'convert to positive and remove the integer part of the number.
	Dim decimalPlaces = 0
    While (n > 0)
        decimalPlaces+=1
        n *= 10
        n -= n
    End While
    Return decimalPlaces
End Function


Рейтинг:
27

Richard MacCutchan

Быстрый взгляд на документацию показывает ... Random.NextDouble Метод (Система) | Microsoft Docs[^].


Maciej Los

5ed!

Рейтинг:
17

CHill60

Это потому что Random.Next возвращает целое число - см. документацию Случайный.Следующий Метод (Система) | Microsoft Docs[^]

Одним из решений может быть генерация числа между MinA * 10 и maxA * 10 и разделите результат на 10.

Вы можете определить необходимое количество знаков после запятой или передать его в качестве параметра, например (непроверено!)

Public Function GetRandom(ByVal Min As Double, ByVal Max As Double, ByVal dp As Integer) As Double
        Static Generator As System.Random = New System.Random()
        Dim r as Integer 
        r = Generator.Next(Min * (10 ^ dp) , (Max * (10 ^ dp)) + 1)
        Return r / ( 10 ^ dp)
    End Function


EDIT - или вы могли бы разумно использовать NextDouble в соответствии с перекрестным решением, которое я пропустил. Д'о.

Единственным моим оправданием было то, что сегодня я просматривал какой-то очень древний код


Maciej Los

5ed!

Richard MacCutchan

Я иногда думаю, что вы узнаете больше, глядя на древний код. :)