From NSIS Wiki
[edit] Description
Linear Congruential Generator
Park, S.K. and K.W. Miller, 1988; Random Number Generators: Good Ones are Hard to Find,
Comm. of the ACM, V. 31. No. 10, pp 1192-1201
n(k+1) = (a * n(k) + b) mod m
m=2147483647, a=16807, b=0
the seed after 10000 iterations should be 1043618065 for n(0)=1
http://www.mactech.com/articles/mactech/Vol.08/08.03/RandomNumbers/
[edit] Syntax
${Random} "Seed" "Min" "Max
"Seed" ; Seed value for generator or last generated random number
"Min" ; name of the initialization file
"Max" ; Callback function then found
Stack 1 ; Random number between 0x00000000 and 0X7FFFFFFF [0x00000000;0X7FFFFFFF]
Stack 2 ; Random number between Min and Max [MIN;MAX]
Do:
IntOp $0 $0 + 1
${Random} $1 0 255
Pop $1
Pop $2
StrCmp $0 "10000" 0 Do
StrCmp $1 1043618065 0 +2
MessageBox MB_OK "Test Minimal Standard Generator o.k."
[edit] The Function
Function Random
; Linear Congruential Generator
; Park, S.K. and K.W. Miller, 1988; Random Number Generators: Good Ones are Hard to Find,
; Comm. of the ACM, V. 31. No. 10, pp 1192-1201
; n(k+1) = (a * n(k) + b) mod m
; m=2147483647, a=16807, b=0
; the seed after 10000 iterations should be 1043618065 for n(0)=1
; http://www.mactech.com/articles/mactech/Vol.08/08.03/RandomNumbers/
;
; Syntax:
; ${Random} "Seed" "Min" "Max
;
; "Seed" ; Seed value for generator or last generated random number
; "Min" ; name of the initialization file
; "Max" ; Callback function then found
;
; Stack 1 ; Random number between 0x00000000 and 0X7FFFFFFF [0x00000000;0X7FFFFFFF]
; Stack 2 ; Random number between min and max [MIN;MAX]
;
; e.g.
; Do:
; IntOp $0 $0 + 1
; ${Random} $1 0 255
; Pop $1
; Pop $2
; StrCmp $0 "10000" 0 Do
; StrCmp $1 1043618065 0 +2
; MessageBox MB_OK "Test Minimal Standard Generator o.k."
;
!define Random `!insertmacro RandomCall`
!macro RandomCall _SEED _MIN _MAX
; save global registers
Push $0
Push $1
Push $2
Push $3
Push $4
Push $5
Push $6
Push $7
Push $8
Push $9
; store parameter
Push `${_SEED}`
Push `${_MIN}`
Push `${_MAX}`
; execute function
Call Random
; restore global register
Pop $9
Pop $8
Pop $7
Pop $6
Pop $5
Pop $4
Pop $3
Pop $2
Exch $1
Exch
Exch $0
!macroend
Function Random
Pop $2 ; _MAX
Pop $1 ; _MIN
Pop $0 ; _SEED
; n(k+1) = (a * n(k) + b) mod m
System::Int64Op /NOUNLOAD 16807 * $0
Pop $0
System::Int64Op /NOUNLOAD $0 + 0
Pop $0
System::Int64Op /NOUNLOAD $0 % 0X7FFFFFFF
Pop $0
; calculate value betwenn _MIN _MAX
IntOp $3 $2 - $1
IntOp $3 $3 + 1
System::Int64Op /NOUNLOAD $0 * $3
Pop $4
System::Int64Op /NOUNLOAD $4 / 0X7FFFFFFF
Pop $4
IntOp $1 $4 + $1
FunctionEnd