Исправьте код, чтобы избежать повторяющихся значений при генерации случайных чисел VB.Net

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

Public Function GetRandom(ByVal Min As Integer, ByVal Max As Integer) As Double

        Static Generator As System.Random = New System.Random()
        Return Generator.Next(Min, Max) / (Max - Min)



    End Function

Затем первая функция находится внутри второй функции для генерации случайных значений. То, что я хочу, это выборка без повторения:

 Public Function aproxpi(n As Integer) As Double
        Dim contador As Integer = 0




        Dim vector(n, 2) As Double



        For i = 0 To n
  ' (0, 700) is a tuning parameter, I've seen that if I choose ( 0,10000) there's a less precise approximation due to repatead values
            vector(i, 1) = GetRandom(0, 700)
            vector(i, 2) = GetRandom(0, 700)
            If (vector(i, 1) ^ 2 + vector(i, 2) ^ 2) < 1 Then
                contador = contador + 1


            End If
        Next
        aproxpi = 4 * (contador / n)


    End Function

vector(i,1) и vector(i,2) являются парой (x,y). Поэтому я не хочу, чтобы (x,y) пар повторялись.

Итак, как я могу избежать повторяющихся значений в моем коде?


person CreamStat    schedule 05.12.2014    source источник
comment
Вы пробовали поиск Google на vb.net генерировать случайное число без повторения? Например, stackoverflow.com/ вопросы/17666175/, а также что такое contador?   -  person Neolisk    schedule 05.12.2014
comment
Похоже, вы ищете алгоритм перетасовки, а не случайный алгоритм. Если ваш min всегда равен 0, почему бы просто не получить случайное число от 0 до 1?   -  person the_lotus    schedule 05.12.2014
comment
Контадор подсчитывает количество точек внутри четверти круга, а n — количество точек внутри квадрата.   -  person CreamStat    schedule 05.12.2014
comment
Я не знаю этого термина. Но если этот термин поможет мне выбрать пары (x,y) без замены с ограничением 0‹x‹1 и 0‹y‹1. Было бы здорово.   -  person CreamStat    schedule 05.12.2014
comment
Вы не обязательно хотите избегать повторяющихся значений, два действительно случайных значения могут быть одинаковыми. Вы хотите избежать повторяющихся значений, потому что Random берется из часов. Это известная слабость. stackoverflow.com/a/1654902/659190   -  person Jodrell    schedule 05.12.2014


Ответы (1)


Если Min всегда равен 0, вы можете просто получить случайное число от 0 до 1. Если вы получите случайное двойное число от 0 до 1 вместо целого числа, у вас будет гораздо больше шансов не получить одно и то же число дважды. Кроме того, я не знаю, почему вы храните все предыдущие числа, в вашем примере это не нужно.

Вот почему я вижу, что вы можете сделать, чтобы изменить это.

ApproximatePI(100000)

Public Function ApproximatePI(ByVal totalIteration As Integer) As Double

    Dim r As New Random()
    Dim insideCircle As Integer

    insideCircle = 0

    For n As Integer = 0 To totalIteration
        Dim x As Double = r.NextDouble()
        Dim y As Double = r.NextDouble()

        If (x ^ 2 + y ^ 2) < 1 Then
            insideCircle += 1
        End If
    Next

    Return (4.0 * insideCircle) / totalIteration
End Function
person the_lotus    schedule 05.12.2014