generator.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. var MersenneTwister = require('../');
  2. var g = new MersenneTwister();
  3. describe('Generator', function() {
  4. it('Should repeat random sequence on same seed', function() {
  5. var seed = 123;
  6. g.init_seed(seed);
  7. var first_1 = g.random();
  8. var first_2 = g.random();
  9. g.init_seed(seed);
  10. var second_1 = g.random();
  11. var second_2 = g.random();
  12. first_1.should.be.exactly(second_1);
  13. first_2.should.be.exactly(second_2);
  14. });
  15. it('Should allow seeding via constructor', function() {
  16. var seed = 325;
  17. var g1 = new MersenneTwister(seed);
  18. var g2 = new MersenneTwister(seed);
  19. for (var i = 0; i < 5; ++i) {
  20. g1.random().should.be.exactly(g2.random());
  21. }
  22. });
  23. it('Should roughly match Python when seeded by array', function() {
  24. var seed1 = 0;
  25. var seed2 = 42;
  26. var g1 = new MersenneTwister([seed1]);
  27. var g2 = new MersenneTwister([seed2]);
  28. /* We should get a near exact match with Python's rng
  29. * when we seed by array. The code for generating
  30. * these comparison values is something like:
  31. import random
  32. r = random.Random(0)
  33. for i in range(10000000):
  34. x = r.random()
  35. if i % 1000000 == 0: print(x)
  36. */
  37. var values1 = [0.84442, 0.34535, 0.25570, 0.32368, 0.89075];
  38. var values2 = [0.63942, 0.55564, 0.55519, 0.81948, 0.94333];
  39. for (var i = 0; i < 5000000; i++) {
  40. var rval1 = g1.random_long();
  41. var rval2 = g2.random_long();
  42. if (i % 1000000 == 0) {
  43. var idx = i / 1000000;
  44. rval1.should.be.approximately(values1[idx], 1e-5);
  45. rval2.should.be.approximately(values2[idx], 1e-5);
  46. }
  47. }
  48. });
  49. });