В ответ на this question я побежал следующий VBA эксперимент:Как понять автокорреляции, вызванные чрезмерным посевом ГСЧ?
Sub Test()
Dim i As Long, A As Variant
Dim count1 As Long, count2 As Long
ReDim A(1 To 10000)
For i = 1 To 10000
Randomize
A(i) = IIf(Rnd() < 0.5, 0, 1)
Next i
'count how often A(i) = A(i+1)
For i = 1 To 9999
If A(i) = A(i + 1) Then count1 = count1 + 1
Next i
For i = 1 To 10000
A(i) = IIf(Rnd() < 0.5, 0, 1)
Next i
'count how often A(i) = A(i+1)
For i = 1 To 9999
If A(i) = A(i + 1) Then count2 = count2 + 1
Next i
Debug.Print "First Loop: " & count1
Debug.Print "Second Loop: " & count2 & vbCrLf
End Sub
Когда я увидел выход так:
First Loop: 5550
Second Loop: 4976
Я был уверен, что я знал, что происходит: VBA было преобразование системы (возможно, микросекунды), что, как следствие, приведет к Randomize
, иногда производя идентичные семена в двух или более проходах через петлю. В моем первоначальном ответе я даже уверенно утверждал это. Но тогда я побежал код еще немного, и заметил, что выход был иногда так:
First Loop: 4449
Second Loop: 5042
подсев до сих пор вызывает заметную автокорреляцию - но в противоположном (и неожиданном) направлении. Последовательные прохождения через петлю с одним и тем же семенем должны давать одинаковые выходы, поэтому мы должны видеть, что последовательные значения согласуются чаще, чем вероятность, предсказанная, а не расходящаяся чаще, чем вероятность.
Любопытный теперь я изменил код для:
Sub Test2()
Dim i As Long, A As Variant
Dim count1 As Long, count2 As Long
ReDim A(1 To 10000)
For i = 1 To 10000
Randomize
A(i) = Rnd()
Next i
'count how often A(i) = A(i+1)
For i = 1 To 9999
If A(i) = A(i + 1) Then count1 = count1 + 1
Next i
For i = 1 To 10000
A(i) = Rnd()
Next i
'count how often A(i) = A(i+1)
For i = 1 To 9999
If A(i) = A(i + 1) Then count2 = count2 + 1
Next i
Debug.Print "First Loop: " & count1
Debug.Print "Second Loop: " & count2 & vbCrLf
End Sub
Который всегда дает следующий результат:
First Loop: 0
Second Loop: 0
Кажется, что не так, что последовательные вызовы Randomize
иногда возвращает одно и то же семя (по крайней мере, не так часто, чтобы иметь значение).
Но если это не источник автокорреляции - что такое? И - почему это иногда проявляется как негативная, а не положительная автокорреляция?
В справке MSDN указано, что «Использование Randomize с тем же значением для числа не повторяет предыдущую последовательность». , поэтому, если таймер возвращает дважды то же значение, Rnd не должен сбрасываться в одно и то же значение. –
, если вы добавите «Rnd -1» перед рандомизацией, вы увидите корреляцию, растущую как ракета. –
@VincentG Хорошие наблюдения, хотя в документации явно не указано, как «Randomize» ведет себя в этом отношении, если вы не передадите ему число, просто «значение, возвращаемое системным таймером, используется в качестве нового начального значения. " Кажется, что государство не является функцией только семени, а семени плюс что-то еще. То, что не ясно, и почему у вас все еще есть корреляции, если возвращаемые числа не совпадают. Тем не менее, ваше наблюдение за добавлением 'Rnd -1' достаточно, чтобы показать, что я неверно истолковал результат моего второго эксперимента. Возможно, вы можете опубликовать его как (частичный) ответ. –