How does a random number generator work?

前端 未结 7 1285
终归单人心
终归单人心 2020-11-29 05:27

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)

7条回答
  •  暖寄归人
    2020-11-29 05:44

    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...

提交回复
热议问题