What I mean, of course, is a Cryptographic PRNG as a Class. 
The internal function RtlGenRandom is used and since it flies below the CrytoAPI radar we can avoid all the usual initialization provided, of course, that we don't need the CryptoAPI for anything else. More details in an earlier Source Code thread post #3 here. The error checking there is PBWin based and stripped out here. The function coded there is fine but multiple calls will see a library being loaded in and out like a yoyo. We can code to avoid that but a Class comes into its own for multiple calls.
Usage: RandCrypto.Bytes( n, flag ) where n is the number of bytes required and flag = 0 will generate a binary string of length n. With flag <> 0 a hex string of length 2n will be generated.
Example use.

The internal function RtlGenRandom is used and since it flies below the CrytoAPI radar we can avoid all the usual initialization provided, of course, that we don't need the CryptoAPI for anything else. More details in an earlier Source Code thread post #3 here. The error checking there is PBWin based and stripped out here. The function coded there is fine but multiple calls will see a library being loaded in and out like a yoyo. We can code to avoid that but a Class comes into its own for multiple calls.
Usage: RandCrypto.Bytes( n, flag ) where n is the number of bytes required and flag = 0 will generate a binary string of length n. With flag <> 0 a hex string of length 2n will be generated.
Code:
' CRandCrypto.inc Declare Function RtlGenRandom( RandomBuffer As Byte, ByVal RandomBufferLength As Dword ) As Long Class CRandCrypto Instance hLib, hProc As Dword Class Method Create hLib = LoadLibrary( "advapi32.dll") hProc = GetProcAddress(hLib, "SystemFunction036") End Method Class Method Destroy FreeLibrary hLib End Method Interface IRandCrypto: Inherit IUnknown Method Bytes( ByVal BinarySize As Dword, ByVal Flag As Long ) As String Local i As Long Dim BinaryByte( ) As Byte Dim HexByte( ) As String * 2 Local hexString As String ReDim BinaryByte( BinarySize - 1 ) As Byte Call Dword hProc Using RtlGenRandom( BinaryByte(0), ByVal BinarySize ) If Flag = 0 Then Method = Peek$( VarPtr( BinaryByte(0) ), BinarySize ) Else hexString = Space$( 2 * BinarySize ) ReDim HexByte( BinarySize - 1 ) As String * 2 At StrPtr( hexString ) ' Overlay hexString with HexByte() For i = 0 To BinarySize - 1 HexByte( i ) = Hex$( BinaryByte(i), 2 ) Next Method = hexString End If End Method End Interface End Class
Code:
#Compile Exe #Optimize speed #Dim All #Tools Off #Register None #Include "WIN32API.INC" %NOMMIDS = 1 %NOGDI = 1 #Include "CRandCrypto.inc" Global RandCrypto As IRandCrypto ' to give access to method anywhere in application Function PBMain Local i As Long Let RandCrypto = Class "CRandCrypto" ? RandCrypto.Bytes(16,1) RandCrypto = Nothing #If %Def(%Pb_Cc32) WaitKey$ #EndIf End Function