How do random number generator works? (for example in C/C++ Java)
How can I write my own random number generator? (for example in C/C++ Java)
here is some code for rolling dice it uses a random number generator I developed myself the pad in this RNG hold hexadecimal values 15 of them in all
DIM pad(15) AS INTEGER CLS egg$ = "EFCDBA01457FA968" ghh$ = egg$ nom% = 0 zen% = LEN(ghh$) WHILE zen% > 0 opp$ = LEFT$(ghh$, 1) eff% = ASC(opp$) IF eff% >= 48 AND eff% <= 57 THEN eff% = eff% - 48 ELSE eff% = (eff% - 65) + 10 IF eff% > 15 THEN eff% = eff% - 32 pad(nom%) = eff% nom% = nom% + 1 zen% = LEN(ghh$) - 1 ypp$ = RIGHT$(ghh$, zen%) ghh$ = ypp$ WEND sol& = 0 FOR zyx% = 0 TO 3 sol& = sol& * 16 sol& = sol& + pad(zyx%) NEXT zyx% sat% = sol& - 32768 RANDOMIZE sat% FOR zyx% = 0 TO 15 PRINT HEX$(pad(zyx%)); NEXT zyx% RANDOMIZE TIMER respawn: INPUT "sides per die"; die% INPUT " number of dice"; dice% INPUT "number to add to dice roll can be negative"; num% INPUT "multiplier use 1 if so desired single precision floating point number"; g! PRINT " hit any key to roll again with these values hit n for new values and q to quit" PRINT " the number will be added or subtracted first before the multiplier takes effect" reroll: sum! = 0 FOR x% = 1 TO dice% GOSUB rndmz GOSUB demf GOSUB drand k% = INT(dr# * die%) + 1 sum! = sum! + k% NEXT x% sum! = (sum! + num) * g! PRINT "you rolled a :"; sum! i$ = "" WHILE i$ = "": i$ = INKEY$: WEND IF i$ = "n" THEN GOTO respawn IF i$ = "q" THEN GOTO theend GOTO reroll theend: SYSTEM END rndmz: rhet$ = "" zum% = 0 FOR yxz% = 0 TO 15 FOR zyx% = 0 TO 15 IF zyx% MOD 3 = 0 THEN zum% = (zum% + pad(zyx%)) MOD 16 IF zyx% MOD 3 = 1 THEN zum% = (zum% + 16 - pad(zyx%)) MOD 16 IF zyx% MOD 3 = 2 THEN zum% = (zum% + INT(RND * 16)) MOD 16 NEXT zyx% rhet$ = rhet$ + HEX$(zum%) NEXT yxz% ghh$ = rhet$ RETURN demf: nom% = 0 zen% = LEN(ghh$) WHILE zen% > 0 opp$ = LEFT$(ghh$, 1) eff% = ASC(opp$) IF eff% >= 48 AND eff% <= 57 THEN eff% = eff% - 48 ELSE eff% = (eff% - 65) + 10 IF eff% > 15 THEN eff% = eff% - 32 pad(nom%) = eff% nom% = nom% + 1 zen% = LEN(ghh$) - 1 ypp$ = RIGHT$(ghh$, zen%) ghh$ = ypp$ WEND FOR zyx% = 0 TO 15 'PRINT HEX$(pad(zyx%)); NEXT zyx% RETURN drand: dr# = pad(0) FOR eff% = 1 TO 15 dr# = dr# / 16 dr# = dr# + pad(eff%) NEXT eff% dr# = dr# / 16 RETURN derf: a# = 1 x# = 1 b# = 1 / (2 ^ .5) c# = .2500000000000011# FOR u% = 1 TO 3 y# = a# a# = (a# + b#) / 2 b# = (b# * y#) ^ .5 c# = c# - x# * (a# - y#) ^ 2 x# = 2 * x# pi# = ((a# + b#) ^ 2) / (4 * c#) PRINT pi# NEXT u% pi# = pi# + .000000000000015# PRINT pi#
this here at the end calculates pi to almost as many places possible in just 3 loops through the algorythm sorry about it being written in archaic basic language, it's the only programing language I know, it might be possible to port this over to c++ or Java
Just take a careful look at the logic of this and especially close attention to the priming or seeding / initialization procedures, which must be used or it will fail as a good rng... this is one I developed for gaming purposes where having huge security is not as much of a concern as speed...