Difference between revisions of "Seedable PRNG"
Jump to navigation
Jump to search
m (link with: llFrand, llListRandomize, Pseudo-random_Number_Generator) |
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; | |||
} | |||
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"); | |||
} | |||
} | |||
</pre> | </pre> | ||
[[Category: LSL Examples]] | [[Category: LSL Examples]] |
Revision as of 19:13, 2 October 2007
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"); } }