1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| Sub Appel_Lehmer_Random_Number_Generator()
Dim i As Long
'Dim j As Long, col As Collection
Dim Seed As Long
Dim modulus As Long
Dim multipl As Long
modulus = Extrait_Premiers(2000000, 1900125)
multipl = Trouve_Multi(modulus, 175)
ReDim TbLrng(0 To modulus, 0 To 1) As Long
Seed = CLng(AleaUnique * 100000)
'calcul :
TbLrng(0, 0) = Lehmer_Random_Number_Generator(modulus, multipl, Seed)
For i = 1 To UBound(TbLrng, 1)
TbLrng(i, 0) = Lehmer_Random_Number_Generator(modulus, multipl, TbLrng(i - 1, 0))
Next i
'Juste pour vérifier :
'Set col = New Collection
'For j = LBound(TbLrng, 1) To UBound(TbLrng, 1)
' On Error Resume Next
' col.Add j, CStr(TbLrng(j, 0))
'Next
'[A1].Resize(UBound(TbLrng, 1)) = TbLrng
'Debug.Print "Valeurs uniques : " & col.Count & _
"; fonction AleaUnique : " & Seed & _
"; 1er résultat : " & TbLrng(0, 0) & _
"; dernier résultat : " & TbLrng(UBound(TbLrng, 1), 0)
End Sub
Private Function Lehmer_Random_Number_Generator(modulus As Long, multiplier As Long, Seed As Long) As Long
Lehmer_Random_Number_Generator = (multiplier * Seed) Mod modulus
End Function
Private Function Extrait_Premiers(Max As Long, index As Long) As Long
Dim Temp() As Boolean, cpt As Long, racine As Long
Dim i As Long, j As Long
ReDim Temp(2 To Max)
'double boucle
racine = Sqr(Max)
For i = 3 To racine Step 2
If Temp(i) = False Then
For j = i * i To Max Step i
Temp(j) = True
Next
End If
Next i
For i = 3 To Max Step 2
If Temp(i) = False Then
If i > index Then Exit For
End If
Next i
Extrait_Premiers = i
End Function
Private Function Trouve_Multi(NP As Long, mini As Long) As Long
Dim l As Long
For l = mini To NP - 1
If PGCD_Recursif(NP, l) = 1 Then Exit For
Next
If l <> NP - 1 Then Trouve_Multi = l
End Function
Private Function PGCD_Recursif(Nb1 As Long, Nb2 As Long) As Long
Dim Reste As Long
Reste = Nb1 Mod Nb2
If Reste = 0 Then
PGCD_Recursif = Nb2
Else
PGCD_Recursif = PGCD_Recursif(Nb2, Reste)
End If
End Function
Private Function AleaUnique() As Single
Dim T As Single
T = Timer
AleaUnique = T - Int(T)
End Function |