Difference between revisions of "Seedable PRNG"

From Second Life Wiki
Jump to navigation Jump to search
m (break the line before the trailing } to make this plainly compilable at a glance -- and copy in the example default.state_entry from the other P R N G while we're at it)
Line 20: Line 20:
     gSeed=seed;
     gSeed=seed;
}
}


integer prng_get()
integer prng_get()
{
{
     gLastHash=llMD5String(gLastHash, gSeed);  
     gLastHash=llMD5String(gLastHash, gSeed);  
    //the bitwise thingy gets rid of negative numbers
    return (integer)("0x" + llGetSubString(gLastHash, 0, 7)) & 0x7FFFFFFF;
}


     //the bitwise thingy gets rid of negative numbers
default
     return (integer)("0x" + llGetSubString(gLastHash, 0, 7)) & 0x7FFFFFFF; }
{
     state_entry()
     {
        prng_seed(2007031901);
 
        string line;
        integer index;
 
        line = "";
        for (index = 0; index < 9; ++index)
        {
          line += " " + (string) prng_get();
        }
        llOwnerSay(line);
 
        line = "";
        for (index = 0; index < 30; ++index)
        {
          line += " " + (string) (1 + (prng_get() % 6));
        }
        llOwnerSay(line);
 
        llOwnerSay("OK");
    }
}
</pre>
</pre>
[[Category: LSL Examples]]
[[Category: LSL Examples]]

Revision as of 19:13, 2 October 2007

See also: llFrand, llListRandomize, Pseudo-random_Number_Generator

md5 based seedable PRNG

It's not the fastest thing but it doesn't seem to have much if any output skew, and I couldn't detect any periodicity in the first 100,000 cycles.


//new md5 based seedable PRNG
//By: Gigs Taggart
//Released under BSD License.
//http://www.opensource.org/licenses/bsd-license.php

integer gSeed=0; 
string gLastHash;

prng_seed(integer seed)
{
    gSeed=seed;
}

integer prng_get()
{
    gLastHash=llMD5String(gLastHash, gSeed); 
    //the bitwise thingy gets rid of negative numbers
    return (integer)("0x" + llGetSubString(gLastHash, 0, 7)) & 0x7FFFFFFF;
}

default
{
    state_entry()
    {
        prng_seed(2007031901);

        string line;
        integer index;

        line = "";
        for (index = 0; index < 9; ++index)
        {
           line += " " + (string) prng_get();
        }
        llOwnerSay(line);

        line = "";
        for (index = 0; index < 30; ++index)
        {
           line += " " + (string) (1 + (prng_get() % 6));
        }
        llOwnerSay(line);

        llOwnerSay("OK");
    }
}