2014-12-05 2 views
0

У меня есть две функции: первая генерирует случайные числа, а вторая делает симуляцию для аппроксимации значения pi.Исправить код, чтобы избежать повторных значений в случайном генерации. 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).

Итак, как я могу повторно использовать значения Avod в моем коде?

+2

Вы попробовали поиск в Google на «vb.net генерировать случайное число без повторения»? Например, http://stackoverflow.com/questions/17666175/random-numbers-in-array-without-any-duplicates, также что такое 'contador'? – Neolisk

+0

Похоже, вы ищете алгоритм перетасовки, а не случайный алгоритм. Если ваш «мин» всегда равен 0, почему бы просто не получить случайное число от 0 до 1? –

+0

Контадор подсчитывает количество точек внутри четверти круга, а n - количество точек внутри квадрата. – CreamStat

ответ

0

Если 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