VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
  Persistable = 0  'NotPersistable
  DataBindingBehavior = 0  'vbNone
  DataSourceBehavior  = 0  'vbNone
  MTSTransactionMode  = 0  'NotAnMTSObject
END
Attribute VB_Name = "clsEvenRnd"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit

Private Declare Function GetTickCount& Lib "kernel32" ()

Private RndArr() As Integer, RndMax As Long, LOVal As Long
Private RndCount As Long, CurrStep As Byte, MaxStep As Integer

Public Sub Init(ByVal LOBound As Long, ByVal HIBound As Long, Optional ByVal MaximumStep As Integer = 1)
    LOVal = LOBound
    RndMax = HIBound - LOBound
    
    ReDim RndArr(RndMax - 1)
    CurrStep = 1
    MaxStep = MaximumStep
    
    If MaxStep <= 0 Then MaxStep = 1
    
    Randomize
    Randomize GetTickCount * Rnd
End Sub

Public Function GetNextRndVal() As Long
    Dim RndVal As Long, K As Long
    
    Do
        RndVal = Fix(RndMax * Rnd)
    Loop Until RndArr(RndVal) < MaxStep
    
    RndArr(RndVal) = RndArr(RndVal) + 1
    RndCount = RndCount + 1
    
    If RndCount >= RndMax * MaxStep Then
        For K = 0 To UBound(RndArr)
            RndArr(K) = 0
        Next K
        
        RndCount = 0
        CurrStep = 1
    End If
    
    GetNextRndVal = LOVal + RndVal
End Function
