Random Pick
i'm having an .ini file that looks like this
[Section]
n0=value 1
n1=value 2
n2=value 3
etc.
i have an nsis script that counts the number of n's in this .ini. is there a clever function to pick a random n?
Archive: Random Pick
Random Pick
i'm having an .ini file that looks like this
[Section]
n0=value 1
n1=value 2
n2=value 3
etc.
i have an nsis script that counts the number of n's in this .ini. is there a clever function to pick a random n?
here
http://forums.winamp.com/showthread....5679&highlight
i am using that way to get a random number too, but it only brings one 'random' number per application run
DOCa Cola
i read this thread before i posted this... i found it a bit weird :)
yea, but it works actually :)
So,
StrCpy $0 $HWNDPARENT 1 -1
Edit: It's not very good, and always outputs the same digit if you use it lots of times in the same installer.
I will find another way for generating random numbers.
-Stu
The best thing I could use was GetFileTime of GetTempFileName
Usage:
Call MakeRandomNum
Pop $R0
$R0 = random number
Function MakeRandomNum
Push $R0
Push $R1
Push $R2
GetTempFileName $R0
GetFileTime $R0 $R1 $R2
SetDetailsPrint none
Delete $R0
SetDetailsPrint both
StrCpy $R0 $R2 1 -1
Sleep 500
Pop $R2
Pop $R1
Exch $R0
FunctionEnd
Try this:
OutFile "Random.exe"
Name "Random"
; Usage:
; Push Seed (or previously generated number)
; Call RandomNumber
; Pop Generated Random Number
Function RandomNumber
Exch $R0
IntOp $R0 $R0 * "13"
IntOp $R0 $R0 + "3"
IntOp $R0 $R0 % "1048576" ; Values goes from 0 to 1048576 (2^20)
Exch $R0
FunctionEnd
Section ""
Push $HWNDPARENT ;Seed
Loop:
Call RandomNumber
Pop $R0
MessageBox MB_YESNO $R0 IDNO +3
Push $R0 ;The new seed
Goto Loop
SectionEnd
That works too, well with a little changes... :up:
OutFile "Random.exe"
Name "Random"
; Usage:
; Push Seed (or previously generated number)
; Call RandomNumber
; Pop Generated Random Number
Function RandomNumber
Exch $R0
IntOp $R0 $R0 * "13"
IntOp $R0 $R0 + "3"
IntOp $R0 $R0 % "1048576" ; Values goes from 0 to 1048576 (2^20)
Exch $R0
FunctionEnd
Function .onInit
Push $HWNDPARENT ;Seed
Loop:
Call RandomNumber
Pop $R0
MessageBox MB_YESNO "Random number: $R0 $\r$\nCreate another one?" IDNO +3
Push $R0 ;The new seed
Goto Loop
Abort
FunctionEnd
Section ""
;I'm a ghost, boo
SectionEnd
lobo's script always picks the same numbers in the same order.
monki's script generates random numbers, but they repeat until one restarts the application.
maybe we can get a real random function as plugin by someone? :P
i figured, the two examples above work worse, the lower the maximum is.
[edit]i simply raised the maximum by 1 and hope the function will never ever be the max (which it hasnt been yet).
You have to generate a better seed by combining time, date, uptime, HWND etc.
maybe someone can convert a number generator from the Blitz++ source to a nsis plugin? :)
just an idea
http://sourceforge.net/projects/blitz/
DOCa Cola
A new code, now you can set a max value for the random number, is only a test and I know that needs a cleanup. Only has a problem, if you set the Max value to 100 (or 10,1000,10000,...), for example, the number 100 has the same probability that the group (0-99):
Probability of 100 = 1/2
Probability of numbers from 0 to 99 = (1/2)/100
But if you set the max at 99 (9,999,9999,9999,...) all the numbers has the same probability.
Last version, I think all works ok. Generates a number between 0 and Max
I've just created a NSIS plugin called nsRandom, based on Borland Delphi 7's Random() function, that can do the trick. It can return random values in a specified range or return values between 0 and 1.
Download it here. An example NSI-script is included. Please comment on it.
Is it not possible to make the plug-in a little smaller? Using C something like this will have a size of about 3 KB.
Originally posted by Joost VerburgYeah, I know. I'll try to get it done in VC++, but I currently don't have Visual Studio installed. I'll keep it in mind though :)
Is it not possible to make the plug-in a little smaller? Using C something like this will have a size of about 3 KB.
System::Call 'kernel32::GetTickCount() i.r0'
will place to r0 a number of ms since OS uptime (DWORD value).
if ms precision is not enough for you, use the following: (that value will never repeat, but it is int64, so use Int64Op to work with it).
System::Call 'kernel32::QueryPerformanceCounter(*l.r0)'
anyway both solution will add ~6 kb compressed :) sorry :)
Originally posted by Joost Verburgbeside that it works really nice :)
Is it not possible to make the plug-in a little smaller? Using C something like this will have a size of about 3 KB.
There is a script on the NSIS archive that generates a random number from 0-9.
It is based upon GetFileTime, so is not officially random.
http://nsis.sourceforge.net/archive/...instances=0,11
-Stu
Originally posted by DOCa ColaYou're welcome :)
beside that it works really nice :)
thx!
DOCa Cola
Indeed, 150kb's is nothing nowadays (well, for non-56k users anyway!)
Thanks so much for plugin support!
-Stu :)
I've just created an NSIS Archive page for nsRandom.
Can't leave happily without pushing system idea ;)
Push Max, call random, pop value. example:
Push 100
call Random
Pop $0
MessageBox MB_OK "Random $0"
Function Random
Exch $0
Push $1
System::Call 'kernel32::QueryPerformanceCounter(*l.r1)'
System::Int64Op $1 % $0
Pop $0
Pop $1
Exch $0
FunctionEnd