diff --git a/index.js b/index.js index 97b03a2..f1abd61 100644 --- a/index.js +++ b/index.js @@ -2,19 +2,14 @@ var gsl = require('./build/default/gsl'); module.exports = { + Random: gsl.Random, random: { get: gsl.rngGet, - Get: gsl.RngGet, min: gsl.rngMin, max: gsl.rngMax, uniform: gsl.rngUniform, - Uniform: gsl.RngUniform, gaussian: gsl.ranGaussian, - Gaussian: gsl.RanGaussian, gaussianZiggurat: gsl.ranGaussianZiggurat, - GaussianZiggurat: gsl.RanGaussianZiggurat, - gaussianRatioMethod: gsl.ranGaussianRatioMethod, - GaussianRatioMethod: gsl.RanGaussianRatioMethod + gaussianRatioMethod: gsl.ranGaussianRatioMethod } }; - diff --git a/readme.md b/readme.md index fdf722d..010ed18 100644 --- a/readme.md +++ b/readme.md @@ -29,82 +29,70 @@ Via git (or downloaded tarball): Random API ---------- -Seed arguments are always optional and must be provided as unsigned integers. +The library takes two forms, functions and iterator objects. Both respect the same names with different conventions. For exemple, obtaining an uniform random name can be done as `random.get()` as well as `(new Random).get()`. If you wished to provide a seed, then you'll respectivelly call `random.get(seed)` and `(new Random(seed)).get()` + +Using an iterator objects make sense when performance is in consideration, specially when using seeds. + +Seeds are always optional and must be provided as unsigned integers. Deviations, used by gaussian functions, are float and default to 3. + +- *Random([seed])* + Construct a new iterator, seel below for available random methods. ### [Sampling](http://www.gnu.org/software/gsl/manual/html_node/Sampling-from-a-random-number-generator.html) - *random.get([seed])* + *Random.get()* Returns a random integer. The minimum and maximum values depend on the algorithm used, but all integers in the range [min,max] are equally likely. The values of min and max can determined using the auxiliary functions `random.min()` and `random.max()`. - -- *random.Get([seed])* - Creates an iterator. Take an optional seed argument as an unsigned int. Random number are obtained by calling `next`. - *random.Get.next()* - Same as `random.get` but called from a `random.Get` instance. - *random.min()* + *Random.min()* Returns the smallest value that `random.get()` can return - *random.max()* + *Random.max()* Returns the largest value that `random.get()` can return - + - *random.uniform([seed])* + *Random.uniform([])* Returns a double precision floating point number uniformly distributed in the range [0,1). The range includes 0.0 but excludes 1.0. - -- *random.Uniform([seed])* - Creates an iterator. Take an optional seed argument as an unsigned int. Random number are obtained by calling `next`. - *random.Uniform.next()* - Same as `random.uniform` but called from a `random.Uniform` instance. ### [Gaussian](http://www.gnu.org/software/gsl/manual/html_node/The-Gaussian-Distribution.html) - *random.gaussian([seed], [deviation])* + *Random.gaussian([deviation])* Returns a Gaussian random float with mean zero. Standart deviation is a float and default to 3. - -- *random.Gaussian([seed])* - Creates an iterator. Take an optional seed argument as an unsigned int. Random number are obtained by calling `next` with an optional deviation. - Also, the `seed` property is accessible. - *random.Gaussian.next([deviation])* - Same as `random.gaussian` but called from a `random.Gaussian` instance. - *random.Gaussian.seed* - Returns the seed used by the iterator. - *random.gaussianZiggurat([seed], [deviation])* + *Random.gaussianZiggurat([deviation])* Same as `random.gaussian` but using the alternative Marsaglia-Tsang ziggurat method. - -- *random.GaussianZiggurat([seed])* - Same as `random.Gaussian` but using the alternative Marsaglia-Tsang ziggurat method. - *random.gaussianRatioMethod([seed], [deviation])* + *Random.gaussianRatioMethod([deviation])* Same as `random.gaussian` but using the alternative Kinderman-Monahan-Leva ratio method. - -- *random.GaussianRatioMethod([seed])* - Same as `random.Gaussian` but using the alternative Kinderman-Monahan-Leva ratio method. Exemple - var random = require('gsl').random, + var gsl = require('gsl'), seed = 50, deviation = 0.5; - console.log( random.gaussian() ); - console.log( random.gaussian(seed) ); - console.log( random.gaussian(seed,deviation) ); + console.log( gsl.random.gaussian() ); + console.log( gsl.random.gaussian(seed) ); + console.log( gsl.random.gaussian(seed, deviation) ); - var it1 = new random.Gaussian(); - console.log( it1.next() ); - it1.seed; + var it1 = new gsl.Random(); + console.log( it1.gaussian() ); - var it1 = new random.Gaussian(seed); - console.log( it1.next(deviation) ); - console.log( it1.seed ); + var it1 = new gsl.Random(seed); + console.log( it1.gaussian(deviation) ); Running the tests ----------------- -Tests are executed with expresso. To install it, simple use `npm install expresso`. +Tests are executed with expresso. To install it, simply issue `npm install expresso`. To run the tests - expresso test + expresso Contributors ------------ diff --git a/samples/gaussian.js b/samples/gaussian.js index 64c0694..58b7ed4 100644 --- a/samples/gaussian.js +++ b/samples/gaussian.js @@ -1,16 +1,14 @@ - var random = require('gsl').random, + var gsl = require('gsl'), seed = 50, deviation = 0.5; + + console.log( gsl.random.gaussian() ); + console.log( gsl.random.gaussian(seed) ); + console.log( gsl.random.gaussian(seed, deviation) ); - console.log( random.gaussian() ); - console.log( random.gaussian(seed) ); - console.log( random.gaussian(seed,deviation) ); - - var it1 = new random.Gaussian(); - console.log( it1.next() ); - it1.seed; + var it1 = new gsl.Random(); + console.log( it1.gaussian() ); - var it1 = new random.Gaussian(seed); - console.log( it1.next(deviation) ); - console.log( it1.seed ); \ No newline at end of file + var it1 = new gsl.Random(seed); + console.log( it1.gaussian(deviation) ); \ No newline at end of file diff --git a/samples/gaussian_speed.js b/samples/gaussian_speed.js index 4632c11..6c5a93b 100644 --- a/samples/gaussian_speed.js +++ b/samples/gaussian_speed.js @@ -54,10 +54,10 @@ var assert = require('assert'), console.log('C++ fn',(new Date).getTime() - time); var time = (new Date).getTime(); - var random = new gsl.random.Gaussian(1978); + var random = new gsl.Random(1978); for(var i=0;i<1000000;i++){ for(var j=0;j<2;j++){ - random.next(); + random.gaussian(); } } console.log('C++ it',(new Date).getTime() - time); @@ -71,10 +71,10 @@ var assert = require('assert'), console.log('C++ fn Ziggurat',(new Date).getTime() - time); var time = (new Date).getTime(); - var random = new gsl.random.GaussianZiggurat(1978); + var random = new gsl.Random(1978); for(var i=0;i<1000000;i++){ for(var j=0;j<2;j++){ - random.next(); + random.gaussianZiggurat(); } } console.log('C++ it Ziggurat',(new Date).getTime() - time); @@ -88,10 +88,10 @@ var assert = require('assert'), console.log('C++ fn RatioMethod',(new Date).getTime() - time); var time = (new Date).getTime(); - var random = new gsl.random.GaussianRatioMethod(1978); + var random = new gsl.Random(1978); for(var i=0;i<1000000;i++){ for(var j=0;j<2;j++){ - random.next(); + random.gaussianRatioMethod(); } } console.log('C++ it RatioMethod',(new Date).getTime() - time); diff --git a/samples/random_speed.js b/samples/random_speed.js index e941d5b..11b3a9e 100644 --- a/samples/random_speed.js +++ b/samples/random_speed.js @@ -39,10 +39,10 @@ var assert = require('assert'), console.log('C++ get fn',(new Date).getTime() - time); var time = (new Date).getTime(); - var random = new gsl.random.Get(1978); + var random = new gsl.Random(1978); for(var i=0;i<1000000;i++){ for(var j=0;j<2;j++){ - random.next(); + random.get(); } } console.log('C++ get it',(new Date).getTime() - time); @@ -56,10 +56,10 @@ var assert = require('assert'), console.log('C++ uniform fn',(new Date).getTime() - time); var time = (new Date).getTime(); - var random = new gsl.random.Uniform(1978); + var random = new gsl.Random(1978); for(var i=0;i<1000000;i++){ for(var j=0;j<2;j++){ - random.next(); + random.uniform(); } } console.log('C++ uniform it',(new Date).getTime() - time); diff --git a/src/gaussian.cc b/src/gaussian.cc index 11d3e6b..920b4df 100644 --- a/src/gaussian.cc +++ b/src/gaussian.cc @@ -30,56 +30,6 @@ Handle ranGaussian(const Arguments& args) return Number::New(val); } -class Gaussian: public ObjectWrap -{ -private: - gsl_rng *_gsl_rng; -public: - int seed; - static Persistent s_ct; - static void Init(Handle target) - { - HandleScope scope; - Local t = FunctionTemplate::New(New); - s_ct = Persistent::New(t); - s_ct->InstanceTemplate()->SetInternalFieldCount(1); - s_ct->SetClassName(String::NewSymbol("Gaussian")); - NODE_SET_PROTOTYPE_METHOD(s_ct, "next", Next); - target->Set(String::NewSymbol("RanGaussian"), s_ct->GetFunction()); - } - ~Gaussian() - { - gsl_rng_free(this->_gsl_rng); - } - static Handle New(const Arguments& args) - { - HandleScope scope; - Gaussian* g = new Gaussian(); - g->Wrap(args.This()); - g->_gsl_rng = gsl_rng_alloc (gsl_rng_default); - if(args.Length() == 1){ - g->seed = args[0]->Uint32Value(); - gsl_rng_set(g->_gsl_rng, g->seed); - } - return args.This(); - } - - static Handle Next(const Arguments& args) - { - HandleScope scope; - Gaussian* g = ObjectWrap::Unwrap(args.This()); - double deviation; - if(args.Length() == 0){ - deviation = 3; - }else{ - deviation = args[0]->NumberValue(); - } - double val = gsl_ran_gaussian(g->_gsl_rng, deviation); - return scope.Close(Number::New(val)); - } - -}; - Handle ranGaussianZiggurat(const Arguments& args) { double deviation; @@ -96,56 +46,6 @@ Handle ranGaussianZiggurat(const Arguments& args) return Number::New(val); } -class GaussianZiggurat: public ObjectWrap -{ -private: - gsl_rng *_gsl_rng; -public: - int seed; - static Persistent s_ct; - static void Init(Handle target) - { - HandleScope scope; - Local t = FunctionTemplate::New(New); - s_ct = Persistent::New(t); - s_ct->InstanceTemplate()->SetInternalFieldCount(1); - s_ct->SetClassName(String::NewSymbol("GaussianZiggurat")); - NODE_SET_PROTOTYPE_METHOD(s_ct, "next", Next); - target->Set(String::NewSymbol("RanGaussianZiggurat"), s_ct->GetFunction()); - } - ~GaussianZiggurat() - { - gsl_rng_free(this->_gsl_rng); - } - static Handle New(const Arguments& args) - { - HandleScope scope; - GaussianZiggurat* g = new GaussianZiggurat(); - g->Wrap(args.This()); - g->_gsl_rng = gsl_rng_alloc (gsl_rng_default); - if(args.Length() == 1){ - g->seed = args[0]->Uint32Value(); - gsl_rng_set(g->_gsl_rng, g->seed); - } - return args.This(); - } - - static Handle Next(const Arguments& args) - { - HandleScope scope; - GaussianZiggurat* g = ObjectWrap::Unwrap(args.This()); - double deviation; - if(args.Length() == 0){ - deviation = 3; - }else{ - deviation = args[0]->NumberValue(); - } - double val = gsl_ran_gaussian_ziggurat(g->_gsl_rng, deviation); - return scope.Close(Number::New(val)); - } - -}; - Handle ranGaussianRatioMethod(const Arguments& args) { double deviation; @@ -162,69 +62,13 @@ Handle ranGaussianRatioMethod(const Arguments& args) return Number::New(val); } -class GaussianRatioMethod: public ObjectWrap -{ -private: - gsl_rng *_gsl_rng; -public: - int seed; - static Persistent s_ct; - static void Init(Handle target) - { - HandleScope scope; - Local t = FunctionTemplate::New(New); - s_ct = Persistent::New(t); - s_ct->InstanceTemplate()->SetInternalFieldCount(1); - s_ct->SetClassName(String::NewSymbol("GaussianRatioMethod")); - NODE_SET_PROTOTYPE_METHOD(s_ct, "next", Next); - target->Set(String::NewSymbol("RanGaussianRatioMethod"), s_ct->GetFunction()); - } - ~GaussianRatioMethod() - { - gsl_rng_free(this->_gsl_rng); - } - static Handle New(const Arguments& args) - { - HandleScope scope; - GaussianRatioMethod* g = new GaussianRatioMethod(); - g->Wrap(args.This()); - g->_gsl_rng = gsl_rng_alloc (gsl_rng_default); - if(args.Length() == 1){ - g->seed = args[0]->Uint32Value(); - gsl_rng_set(g->_gsl_rng, g->seed); - } - return args.This(); - } - - static Handle Next(const Arguments& args) - { - HandleScope scope; - GaussianRatioMethod* g = ObjectWrap::Unwrap(args.This()); - double deviation; - if(args.Length() == 0){ - deviation = 3; - }else{ - deviation = args[0]->NumberValue(); - } - double val = gsl_ran_gaussian_ratio_method(g->_gsl_rng, deviation); - return scope.Close(Number::New(val)); - } - -}; - -Persistent Gaussian::s_ct; -Persistent GaussianZiggurat::s_ct; -Persistent GaussianRatioMethod::s_ct; extern "C" { static void gaussian_init(Handle target) { HandleScope scope; target->Set(String::New("ranGaussian"), FunctionTemplate::New(ranGaussian)->GetFunction()); - Gaussian::Init(target); target->Set(String::New("ranGaussianZiggurat"), FunctionTemplate::New(ranGaussianZiggurat)->GetFunction()); - GaussianZiggurat::Init(target); target->Set(String::New("ranGaussianRatioMethod"), FunctionTemplate::New(ranGaussianRatioMethod)->GetFunction()); - GaussianRatioMethod::Init(target); } } diff --git a/src/gsl.cc b/src/gsl.cc index b3ffe9e..98fceeb 100644 --- a/src/gsl.cc +++ b/src/gsl.cc @@ -16,6 +16,7 @@ using namespace node; using namespace v8; +Persistent Random::s_ct; extern "C" { static void init (Handle target) { diff --git a/src/random.cc b/src/random.cc index 45fc228..a80a97d 100644 --- a/src/random.cc +++ b/src/random.cc @@ -35,7 +35,16 @@ Handle rngMax(const Arguments& args) return Int32::NewFromUnsigned(val); } -class RngGet: public ObjectWrap +Handle rngUniform(const Arguments& args) +{ + if(args.Length() == 1){ + gsl_rng_set (r_global, args[0]->Uint32Value()); + } + double val = gsl_rng_uniform(r_global); + return Number::New(val); +} + +class Random: public ObjectWrap { private: gsl_rng *_gsl_rng; @@ -48,92 +57,85 @@ class RngGet: public ObjectWrap Local t = FunctionTemplate::New(New); s_ct = Persistent::New(t); s_ct->InstanceTemplate()->SetInternalFieldCount(1); - s_ct->SetClassName(String::NewSymbol("RngGet")); - NODE_SET_PROTOTYPE_METHOD(s_ct, "next", Next); - target->Set(String::NewSymbol("RngGet"), s_ct->GetFunction()); + s_ct->SetClassName(String::NewSymbol("Random")); + NODE_SET_PROTOTYPE_METHOD(s_ct, "get", Get); + NODE_SET_PROTOTYPE_METHOD(s_ct, "uniform", Uniform); + NODE_SET_PROTOTYPE_METHOD(s_ct, "gaussian", Gaussian); + NODE_SET_PROTOTYPE_METHOD(s_ct, "gaussianZiggurat", GaussianZiggurat); + NODE_SET_PROTOTYPE_METHOD(s_ct, "gaussianRatioMethod", GaussianRatioMethod); + target->Set(String::NewSymbol("Random"), s_ct->GetFunction()); } - ~RngGet() + ~Random() { gsl_rng_free(this->_gsl_rng); } static Handle New(const Arguments& args) { HandleScope scope; - RngGet* g = new RngGet(); - g->Wrap(args.This()); + Random* g = new Random(); + g->Wrap(args.Holder()); g->_gsl_rng = gsl_rng_alloc(gsl_rng_default); if(args.Length() == 1){ g->seed = args[0]->Uint32Value(); gsl_rng_set(g->_gsl_rng, g->seed); } - return args.This(); + return args.Holder(); } - - static Handle Next(const Arguments& args) + static Handle Get(const Arguments& args) { HandleScope scope; - RngGet* g = ObjectWrap::Unwrap(args.This()); + Random* g = ObjectWrap::Unwrap(args.Holder()); unsigned int val = gsl_rng_get(g->_gsl_rng); return scope.Close(Int32::NewFromUnsigned(val)); } - -}; - -Handle rngUniform(const Arguments& args) -{ - if(args.Length() == 1){ - gsl_rng_set (r_global, args[0]->Uint32Value()); - } - double val = gsl_rng_uniform(r_global); - return Number::New(val); -} - -class RngUniform: public ObjectWrap -{ -private: - gsl_rng *_gsl_rng; -public: - int seed; - static Persistent s_ct; - static void Init(Handle target) + static Handle Uniform(const Arguments& args) { HandleScope scope; - Local t = FunctionTemplate::New(New); - s_ct = Persistent::New(t); - s_ct->InstanceTemplate()->SetInternalFieldCount(1); - s_ct->SetClassName(String::NewSymbol("RngUniform")); - NODE_SET_PROTOTYPE_METHOD(s_ct, "next", Next); - target->Set(String::NewSymbol("RngUniform"), s_ct->GetFunction()); + Random* g = ObjectWrap::Unwrap(args.Holder()); + double val = gsl_rng_uniform(g->_gsl_rng); + return scope.Close(Number::New(val)); } - ~RngUniform() + static Handle Gaussian(const Arguments& args) { - gsl_rng_free(this->_gsl_rng); + HandleScope scope; + Random* g = ObjectWrap::Unwrap(args.Holder()); + double deviation; + if(args.Length() == 0){ + deviation = 3; + }else{ + deviation = args[0]->NumberValue(); + } + double val = gsl_ran_gaussian(g->_gsl_rng, deviation); + return scope.Close(Number::New(val)); } - static Handle New(const Arguments& args) + static Handle GaussianZiggurat(const Arguments& args) { HandleScope scope; - RngUniform* g = new RngUniform(); - g->Wrap(args.This()); - g->_gsl_rng = gsl_rng_alloc(gsl_rng_default); - if(args.Length() == 1){ - g->seed = args[0]->Uint32Value(); - gsl_rng_set(g->_gsl_rng, g->seed); + Random* g = ObjectWrap::Unwrap(args.Holder()); + double deviation; + if(args.Length() == 0){ + deviation = 3; + }else{ + deviation = args[0]->NumberValue(); } - return args.This(); + double val = gsl_ran_gaussian_ziggurat(g->_gsl_rng, deviation); + return scope.Close(Number::New(val)); } - - static Handle Next(const Arguments& args) + static Handle GaussianRatioMethod(const Arguments& args) { HandleScope scope; - RngUniform* g = ObjectWrap::Unwrap(args.This()); - double val = gsl_rng_uniform(g->_gsl_rng); + Random* g = ObjectWrap::Unwrap(args.Holder()); + double deviation; + if(args.Length() == 0){ + deviation = 3; + }else{ + deviation = args[0]->NumberValue(); + } + double val = gsl_ran_gaussian_ratio_method(g->_gsl_rng, deviation); return scope.Close(Number::New(val)); } - }; -Persistent RngGet::s_ct; -Persistent RngUniform::s_ct; extern "C" { static void random_init(Handle target) { @@ -141,9 +143,8 @@ extern "C" { target->Set(String::New("rngGet"), FunctionTemplate::New(rngGet)->GetFunction()); target->Set(String::New("rngMin"), FunctionTemplate::New(rngMin)->GetFunction()); target->Set(String::New("rngMax"), FunctionTemplate::New(rngMax)->GetFunction()); - RngGet::Init(target); target->Set(String::New("rngUniform"), FunctionTemplate::New(rngUniform)->GetFunction()); - RngUniform::Init(target); + Random::Init(target); } } diff --git a/test/gaussian.js b/test/gaussian.js index a2225f1..20e3211 100644 --- a/test/gaussian.js +++ b/test/gaussian.js @@ -14,28 +14,21 @@ module.exports = { assert.eql(100, Object.keys(results).length); }, 'Test gaussian - function with seed': function(){ - var results1 = {}; + var results1 = {}, results2 = {}; for(var i=0;i<100;i++){ - var random = gsl.random.gaussian(1978); - assert.ok( 'number', typeof random ); - assert.ok( !isNaN(random) ); - results1[ random ] = true; + results1[ gsl.random.gaussian(1978) ] = true; } - var results2 = {}; for(var i=0;i<100;i++){ - var random = gsl.random.gaussian(1978); - assert.ok( 'number', typeof random ); - assert.ok( !isNaN(random) ); - results2[ random ] = true; + results2[ gsl.random.gaussian(1978) ] = true; } assert.eql(1,Object.keys(results1).length); assert.eql(results1,results2); }, 'Test gaussian - object': function(){ var results = {}; - var obj = new gsl.random.Gaussian(); + var obj = new gsl.Random(); for(var i=0;i<100;i++){ - var random = obj.next(); + var random = obj.gaussian(); assert.ok( 'number', typeof random ); assert.ok( !isNaN(random) ); results[ random ] = true; @@ -43,15 +36,14 @@ module.exports = { assert.eql(100, Object.keys(results).length); }, 'Test gaussian - object with seed': function(){ - var results1 = {}; - var obj1 = new gsl.random.Gaussian(1978); + var results1 = {}, results2 = {}; + var obj1 = new gsl.Random(1978); for(var i=0;i<100;i++){ - results1[ obj1.next() ] = true; + results1[ obj1.gaussian() ] = true; } - var results2 = {}; - var obj2 = new gsl.random.Gaussian(1978); + var obj2 = new gsl.Random(1978); for(var i=0;i<100;i++){ - results2[ obj2.next() ] = true; + results2[ obj2.gaussian() ] = true; } assert.eql(100,Object.keys(results1).length); assert.eql(results1,results2); @@ -67,28 +59,21 @@ module.exports = { assert.eql(100, Object.keys(results).length); }, 'Test gaussian ziggurat - function with seed': function(){ - var results1 = {}; + var results1 = {}, results2 = {}; for(var i=0;i<100;i++){ - var random = gsl.random.gaussianZiggurat(1978); - assert.ok( 'number', typeof random ); - assert.ok( !isNaN(random) ); - results1[ random ] = true; + results1[ gsl.random.gaussianZiggurat(1978) ] = true; } - var results2 = {}; for(var i=0;i<100;i++){ - var random = gsl.random.gaussianZiggurat(1978); - assert.ok( 'number', typeof random ); - assert.ok( !isNaN(random) ); - results2[ random ] = true; + results2[ gsl.random.gaussianZiggurat(1978) ] = true; } assert.eql(1,Object.keys(results1).length); assert.eql(results1,results2); }, 'Test gaussian ziggurat - object': function(){ var results = {}; - var obj = new gsl.random.GaussianZiggurat(); + var obj = new gsl.Random(); for(var i=0;i<100;i++){ - var random = obj.next(); + var random = obj.gaussianZiggurat(); assert.ok( 'number', typeof random ); assert.ok( !isNaN(random) ); results[ random ] = true; @@ -96,15 +81,14 @@ module.exports = { assert.eql(100, Object.keys(results).length); }, 'Test gaussian ziggurat - object with seed': function(){ - var results1 = {}; - var obj1 = new gsl.random.GaussianZiggurat(1978); + var results1 = {}, results2 = {}; + var obj1 = new gsl.Random(1978); for(var i=0;i<100;i++){ - results1[ obj1.next() ] = true; + results1[ obj1.gaussianZiggurat() ] = true; } - var results2 = {}; - var obj2 = new gsl.random.GaussianZiggurat(1978); + var obj2 = new gsl.Random(1978); for(var i=0;i<100;i++){ - results2[ obj2.next() ] = true; + results2[ obj2.gaussianZiggurat() ] = true; } assert.eql(100,Object.keys(results1).length); assert.eql(results1,results2); @@ -120,28 +104,21 @@ module.exports = { assert.eql(100, Object.keys(results).length); }, 'Test gaussian ratio method - function with seed': function(){ - var results1 = {}; + var results1 = {}, results2 = {}; for(var i=0;i<100;i++){ - var random = gsl.random.gaussianRatioMethod(1978); - assert.ok( 'number', typeof random ); - assert.ok( !isNaN(random) ); - results1[ random ] = true; + results1[ gsl.random.gaussianRatioMethod(1978) ] = true; } - var results2 = {}; for(var i=0;i<100;i++){ - var random = gsl.random.gaussianRatioMethod(1978); - assert.ok( 'number', typeof random ); - assert.ok( !isNaN(random) ); - results2[ random ] = true; + results2[ gsl.random.gaussianRatioMethod(1978) ] = true; } assert.eql(1,Object.keys(results1).length); assert.eql(results1,results2); }, 'Test gaussian ratio method - object': function(){ var results = {}; - var obj = new gsl.random.GaussianRatioMethod(); + var obj = new gsl.Random(); for(var i=0;i<100;i++){ - var random = obj.next(); + var random = obj.gaussianRatioMethod(); assert.ok( 'number', typeof random ); assert.ok( !isNaN(random) ); results[ random ] = true; @@ -149,15 +126,14 @@ module.exports = { assert.eql(100, Object.keys(results).length); }, 'Test gaussian ratio method - object with seed': function(){ - var results1 = {}; - var obj1 = new gsl.random.GaussianRatioMethod(1978); + var results1 = {}, results2 = {}; + var obj1 = new gsl.Random(1978); for(var i=0;i<100;i++){ - results1[ obj1.next() ] = true; + results1[ obj1.gaussianRatioMethod() ] = true; } - var results2 = {}; - var obj2 = new gsl.random.GaussianRatioMethod(1978); + var obj2 = new gsl.Random(1978); for(var i=0;i<100;i++){ - results2[ obj2.next() ] = true; + results2[ obj2.gaussianRatioMethod() ] = true; } assert.eql(100,Object.keys(results1).length); assert.eql(results1,results2); diff --git a/test/random.js b/test/random.js index fe8aede..23943ee 100644 --- a/test/random.js +++ b/test/random.js @@ -26,14 +26,13 @@ module.exports = { assert.eql(100, Object.keys(results).length); }, 'Test get - function with seed': function(){ - var results1 = {}; + var results1 = {}, results2 = {}; for(var i=0;i<100;i++){ var random = gsl.random.get(1978); assert.ok( 'number', typeof random ); assert.ok( !isNaN(random) ); results1[ random ] = true; } - var results2 = {}; for(var i=0;i<100;i++){ var random = gsl.random.get(1978); assert.ok( 'number', typeof random ); @@ -45,9 +44,9 @@ module.exports = { }, 'Test get - object': function(){ var results = {}; - var obj = new gsl.random.Get(); + var obj = new gsl.Random(); for(var i=0;i<100;i++){ - var random = obj.next(); + var random = obj.get(); assert.ok( 'number', typeof random ); assert.ok( !isNaN(random) ); results[ random ] = true; @@ -55,15 +54,14 @@ module.exports = { assert.eql(100, Object.keys(results).length); }, 'Test get - object with seed': function(){ - var results1 = {}; - var obj1 = new gsl.random.Get(1978); + var results1 = {}, results2 = {}; + var obj1 = new gsl.Random(1978); for(var i=0;i<100;i++){ - results1[ obj1.next() ] = true; + results1[ obj1.get() ] = true; } - var results2 = {}; - var obj2 = new gsl.random.Get(1978); + var obj2 = new gsl.Random(1978); for(var i=0;i<100;i++){ - results2[ obj2.next() ] = true; + results2[ obj2.get() ] = true; } assert.eql(100,Object.keys(results1).length); assert.eql(results1,results2); @@ -80,28 +78,21 @@ module.exports = { assert.eql(100, Object.keys(results).length); }, 'Test uniform - function with seed': function(){ - var results1 = {}; + var results1 = {}, results2 = {}; for(var i=0;i<100;i++){ - var random = gsl.random.uniform(1978); - assert.ok( 'number', typeof random ); - assert.ok( !isNaN(random) ); - results1[ random ] = true; + results1[ gsl.random.uniform(1978) ] = true; } - var results2 = {}; for(var i=0;i<100;i++){ - var random = gsl.random.uniform(1978); - assert.ok( 'number', typeof random ); - assert.ok( !isNaN(random) ); - results2[ random ] = true; + results2[ gsl.random.uniform(1978) ] = true; } assert.eql(1,Object.keys(results1).length); assert.eql(results1,results2); }, 'Test uniform - object': function(){ var results = {}; - var obj = new gsl.random.Uniform(); + var obj = new gsl.Random(); for(var i=0;i<100;i++){ - var random = obj.next(); + var random = obj.uniform(); assert.ok( 'number', typeof random ); assert.ok( !isNaN(random) ); results[ random ] = true; @@ -109,15 +100,14 @@ module.exports = { assert.eql(100, Object.keys(results).length); }, 'Test uniform - object with seed': function(){ - var results1 = {}; - var obj1 = new gsl.random.Uniform(1978); + var results1 = {}, results2 = {}; + var obj1 = new gsl.Random(1978); for(var i=0;i<100;i++){ - results1[ obj1.next() ] = true; + results1[ obj1.uniform() ] = true; } - var results2 = {}; - var obj2 = new gsl.random.Uniform(1978); + var obj2 = new gsl.Random(1978); for(var i=0;i<100;i++){ - results2[ obj2.next() ] = true; + results2[ obj2.uniform() ] = true; } assert.eql(100,Object.keys(results1).length); assert.eql(results1,results2);