composite_rng 0.0.3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7c30e36b6d59c807536035ad3fdbaefa8dccb420
4
- data.tar.gz: 3ff2d418c856aa7af2b76af17e5f9d3950caa6d8
3
+ metadata.gz: 1f340e108ce670dca8fd91ec9089ae5753eae06e
4
+ data.tar.gz: b992ad5f3defe4e2578090833730107b256bfc89
5
5
  SHA512:
6
- metadata.gz: 8282ef4f619b086e53fc1663cc843008b194f533baa72d0806d499d4ef4e3c5bdad1c50e9a49de39d1825d379c5275d697edc0c00dbe0275214ddfa2c185e7c4
7
- data.tar.gz: 495bef03e18c3860c9e50cb023fe50e70b792d66f9d066ee830697e2c290d9668a0a273b4b7ba8b82d609862f1ca98d66bfddaa4c9ad355670b1777dd2120652
6
+ metadata.gz: 1731dee7aeb11ec2f9006853c038211c89afcaa4a5e4e9f4e6b3f74e24339218d39c2108e270feea0b05aa01a9f6277d365fb27b59e1397d2799f06d314f828d
7
+ data.tar.gz: cf12a60cc2dba80842ef8f2e73dede341cb0a7e6766f1800a6bec6f16b00fbf3a2dd030f7e380818288f3670120f1d12a18d824985ea45dce084da9176f947a4
data/README.md CHANGED
@@ -2,30 +2,36 @@
2
2
 
3
3
  The composite (psuedo) random number generator is a container for two other
4
4
  (psuedo) random number generators. By working together, these create higher
5
- quality random number streams than either could by itself.
5
+ quality pseudo-random number streams than either could by itself.
6
6
 
7
- The two generators do NOT need to be the same type. While not a good idea,
8
- they may even be the same instance, or the same type with the same seed, but
9
- this negates the advantage of compositing them.
7
+ The two generators do not need to be the same type. In fact it helps to reduce
8
+ any possible correlation between the parent and the child if they are
9
+ completely different sorts of generators. It is really not a good idea for them
10
+ to be either the same instance, or the same type with the same seed, because
11
+ this negates the advantage of compositing generators.
10
12
 
11
13
  The generators used must comply to the following duck characteristics:
12
14
 
13
15
  rand(max) - This method must compute a random integer from 0...max
14
16
 
15
- That's all! The following shows how this could work:
17
+ The constructor takes four arguments:
18
+ * The parent PRNG that is used to "educate" the child.
19
+ * The child PRNG that is the actual generator of data.
20
+ * The optional churn_limit factor that controls how much tutoring the child
21
+ can receive. This optional parameter defaults to 16. This value may be read
22
+ back with the churn_limit property. Valid values are 2..256
23
+ * The optional init factor that controls the amount of initial tutoring the
24
+ child receives initially. This defaults to 0 for none. Valid values are 0..256
25
+
26
+ The following shows how this could work:
16
27
  ```ruby
17
28
  parent = Random.new #Get the built in Mersenne Twister MT19937 PRNG
18
29
  child = Random.new
19
- composite = CompositeRng.new(parent, child, 42)
30
+ composite = CompositeRng.new(parent, child, 42, 11)
20
31
  # ...
21
32
  dice_roll = 1 + composite.rand(6)
22
33
  # ...
23
34
  ```
24
- The constructor takes three arguements:
25
- * The parent PRNG that is used to "educate" the child.
26
- * The child PRNG that is the actual generator of data.
27
- * The churn factor that controls how much tutoring the child is to receive.
28
- This optional parameter defaults to 16.
29
35
 
30
36
  It is also possible to use the default PRNG as follows:
31
37
  ```ruby
@@ -87,6 +93,8 @@ Or install it yourself as:
87
93
 
88
94
  The composite_rng gem itself is found at: ( https://rubygems.org/gems/composite_rng )
89
95
 
96
+ The fibonacci_rng code lives at: ( https://github.com/PeterCamilleri/fibonacci_rng )
97
+
90
98
  ## Contributing
91
99
 
92
100
  #### Plan A
data/lib/composite_rng.rb CHANGED
@@ -3,13 +3,35 @@ require_relative "composite_rng/version"
3
3
  #A class of random number generators that work by nesting other PRNGs.
4
4
  class CompositeRng
5
5
 
6
+ #The limits on the churn limit.
7
+ CHURNS = 2..256
8
+
9
+ #The limits on the init.
10
+ INITS = 0..256
11
+
12
+ #The current upper limit on churn
13
+ attr_reader :churn_limit
14
+
6
15
  #Create a composite PRNG
7
16
  #<br>Parameters
8
17
  #* parent - the starting PRNG
9
18
  #* child - the progeny PRNG
10
- #* churn - the amount of churning done.
11
- def initialize(parent, child, churn=16)
12
- @parent, @child, @churn = parent, child, churn
19
+ #* churn_limit - the max amount of churning done.
20
+ #* init = the number of initial churn steps.
21
+ def initialize(parent, child, churn_limit=16, init=0)
22
+ @parent, @child, @churn_limit = parent, child, churn_limit
23
+
24
+ #Validate the churn_limit
25
+ unless CHURNS === @churn_limit
26
+ fail "Invalid churn limit #{@churn_limit}. Allowed values are #{CHURNS}"
27
+ end
28
+
29
+ #Validate the init
30
+ unless INITS === init
31
+ fail "Invalid init value #{init}. Allowed values are #{INITS}"
32
+ end
33
+
34
+ init.times { churn }
13
35
  end
14
36
 
15
37
  #An access point for random numbers.
@@ -25,7 +47,7 @@ class CompositeRng
25
47
  #<br>Returns
26
48
  #* a churned random number generator.
27
49
  def churn
28
- (1 + @parent.rand(@churn)).times {@child.rand(256)}
50
+ (1 + @parent.rand(@churn_limit)).times {@child.rand(256)}
29
51
  @child
30
52
  end
31
53
 
@@ -1,4 +1,4 @@
1
1
  class CompositeRng
2
2
  #The CompositeRng version.
3
- VERSION = "0.0.3"
3
+ VERSION = "0.1.0"
4
4
  end
@@ -11,6 +11,14 @@ class CompositeRngTester < Minitest::Test
11
11
  #Track mini-test progress.
12
12
  include MinitestVisible
13
13
 
14
+ def test_that_it_checks_parms
15
+ assert_raises { CompositeRng.new(Random.new, Random.new, -1, 0) }
16
+ assert_raises { CompositeRng.new(Random.new, Random.new, 300, 0) }
17
+
18
+ assert_raises { CompositeRng.new(Random.new, Random.new, 2, -1) }
19
+ assert_raises { CompositeRng.new(Random.new, Random.new, 2, 300) }
20
+ end
21
+
14
22
  def test_that_it_creates_dice_rolls
15
23
  prng = CompositeRng.new(Random.new, Random.new)
16
24
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: composite_rng
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Camilleri
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-04 00:00:00.000000000 Z
11
+ date: 2016-05-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler