composite_rng 0.0.3 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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