Seedable PRNG
Revision as of 20:13, 2 October 2007 by Ppaatt Lynagh (talk | contribs) (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)
| LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
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");
}
}