aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLu Wang <coolwanglu@gmail.com>2013-11-25 18:57:04 +0800
committerLu Wang <coolwanglu@gmail.com>2013-11-25 18:57:04 +0800
commitb37cdde052d8da61d6a3d9c21359aaeee9dd7c60 (patch)
treea34a24ce2f7fe7a840d3a76e4d6060c61894d490 /src
parentb988457c13f77f50e03b4e46fbef4d5e42cfcf33 (diff)
srand() & simple rand() supporing seed
Diffstat (limited to 'src')
-rw-r--r--src/library.js30
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() {