diff options
author | Lu Wang <coolwanglu@gmail.com> | 2013-11-25 18:57:04 +0800 |
---|---|---|
committer | Lu Wang <coolwanglu@gmail.com> | 2013-11-25 18:57:04 +0800 |
commit | b37cdde052d8da61d6a3d9c21359aaeee9dd7c60 (patch) | |
tree | a34a24ce2f7fe7a840d3a76e4d6060c61894d490 /src | |
parent | b988457c13f77f50e03b4e46fbef4d5e42cfcf33 (diff) |
srand() & simple rand() supporing seed
Diffstat (limited to 'src')
-rw-r--r-- | src/library.js | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/src/library.js b/src/library.js index 3df61724..d55f9c0c 100644 --- a/src/library.js +++ b/src/library.js @@ -3445,13 +3445,31 @@ LibraryManager.library = { return limit; }, - // Use browser's Math.random(). We can't set a seed, though. - srand: function(seed) {}, // XXX ignored + __rand_seed: 'allocate([0x0273459b, 0, 0, 0], "i32", ALLOC_STATIC)', + srand__deps: ['__rand_seed'], + srand: function(seed) { + {{{ makeSetValue('___rand_seed', 0, 'seed', 'i32') }}} + }, + rand_r__deps: ['__rand_seed'], + rand_r: function(seed) { + var val = {{{ makeGetValue('___rand_seed', 0, 'i32') }}}; + // calculate val * 31010991 + 0x676e6177 + // i32 multiplication will be rounded by javascript + var valh = val >> 16; + var vall = val & 0xffff; + + var c = 31010991; + var ch = c >> 16; + var cl = c & 0xffff; + + val = (((valh * cl + vall * ch) << 16) + vall * cl + 0x676e6177) & 0x7fffffff; + + {{{ makeSetValue('___rand_seed', 0, 'val', 'i32') }}} + return val; + }, + rand__deps: ['rand_r'], rand: function() { - return Math.floor(Math.random()*0x80000000); - }, - rand_r: function(seed) { // XXX ignores the seed - return Math.floor(Math.random()*0x80000000); + return _rand_r(___rand_seed); }, drand48: function() { |