composite_rng 0.0.1

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 ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YTY0YTA0OWM2M2I1MDQ0YTRkNjdkMDU0YmY0OWVhMGE0NDZkMTgwZg==
5
+ data.tar.gz: !binary |-
6
+ M2U5MzVlN2UzOWEwNmFiZjU5YmIyZGIyNjlhOTdmN2Q0YWI2ZWViOA==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ MDExOGI0YjNlMTM0Njc3YzZhYjA5NDBmZTg0Njc2NDA4ZjBkMjY1ZDE0MDcw
10
+ MmM4ZTViNzI4YWVmN2NkM2NmYzM0ZjRlZGNlNjI2MzM3ZTQ2YmI1NmI5NTMy
11
+ YjRmYTI4YjZhY2FkNDhmY2JlM2ViNGUzNDZiZWY2Y2RhNThiMGQ=
12
+ data.tar.gz: !binary |-
13
+ ZWViMTI5YWU5MDg2MGFkNzg5NDIxY2EwOTkyYWM3YjhhNWI0NmFjZTQ4MDM4
14
+ YjhkZjFiYjAxMDNmOWU3ZWI3MWE0NmNlMGY0MGQ2NjJkOWE4ZWFjYjFmY2E3
15
+ ZDE2YWExOWUxOTlmYTI1ODdkYWRjNTNjMDI0YzdmZGVjOWY1OTA=
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in composite_rng.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Peter Camilleri
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,63 @@
1
+ # CompositeRng
2
+
3
+ The composite (psuedo) random number generator is a container for two other
4
+ (psuedo) random number generators. By working together, these create higher
5
+ quality random number streams than either could by itself.
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.
10
+
11
+ The generators used most comply to the following duck characteristics:
12
+
13
+ rand(max) - This method must compute a random integer from 0...max
14
+
15
+ That's all! The following shows how this could work:
16
+
17
+ parent = Random.new #Get the built in Mersenne Twister MT19937 PRNG
18
+ child = Random.new
19
+ composite = CompositeRng.new(parent, child)
20
+ # ...
21
+ dice_roll = composite(6)
22
+ # ...
23
+
24
+ It is also possible to use the default PRNG as follows:
25
+
26
+ parent = Object.new
27
+ child = Random.new
28
+ composite = CompositeRng.new(parent, child)
29
+ # ...
30
+ dice_roll = composite(6)
31
+ # ...
32
+
33
+ This is because the default PRNG exists as methods of Object. Note that (as
34
+ far as I can tell) only one instance of that PRNG exists, so it should only
35
+ be used as parent or child but never both!.
36
+
37
+ Most PRNGs provide more resources beyond the basic "rand" method. Access to
38
+ these other methods is provided by using the churn method. An example,
39
+ accessing the bytes method of the Random class follows:
40
+
41
+ crazy_string = composite.churn.bytes(22) # Get a string of 22 random chars.
42
+
43
+ ## Installation
44
+
45
+ Add this line to your application's Gemfile:
46
+
47
+ gem 'composite_rng'
48
+
49
+ And then execute:
50
+
51
+ $ bundle
52
+
53
+ Or install it yourself as:
54
+
55
+ $ gem install composite_rng
56
+
57
+ ## Contributing
58
+
59
+ 1. Fork it
60
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
61
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
62
+ 4. Push to the branch (`git push origin my-new-feature`)
63
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,49 @@
1
+ # coding: utf-8
2
+ require 'rake/testtask'
3
+ require 'rdoc/task'
4
+ require "bundler/gem_tasks"
5
+
6
+ #Run the fOOrth unit test suite.
7
+ Rake::TestTask.new do |t|
8
+ #List out all the test files.
9
+ t.test_files = FileList['tests/**/*.rb']
10
+ t.verbose = false
11
+ end
12
+
13
+ #Generate internal documentation with rdoc.
14
+ RDoc::Task.new do |rdoc|
15
+ rdoc.rdoc_dir = "rdoc"
16
+
17
+ #List out all the files to be documented.
18
+ rdoc.rdoc_files.include("lib/**/*.rb", "license.txt", "README.md")
19
+
20
+ #Make all access levels visible.
21
+ rdoc.options << '--visibility' << 'private'
22
+
23
+ #Set a title.
24
+ rdoc.options << '--title' << 'CompositeRng Docs'
25
+
26
+ end
27
+
28
+ desc "Run a scan for smelly code!"
29
+ task :reek do |t|
30
+ `reek --no-color lib > reek.txt`
31
+ end
32
+
33
+ desc "Fire up an IRB session with composite_rng preloaded."
34
+ task :console do
35
+ require 'irb'
36
+ require 'irb/completion'
37
+
38
+ require './lib/composite_rng'
39
+ puts "Starting an IRB console for composite_rng."
40
+
41
+ ARGV.clear
42
+ IRB.start
43
+ end
44
+
45
+ desc "What version of the composite_rng is this?"
46
+ task :vers do |t|
47
+ puts
48
+ puts "CompositeRng version = #{CompositeRng::VERSION}"
49
+ end
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'composite_rng/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "composite_rng"
8
+ spec.version = CompositeRng::VERSION
9
+ spec.authors = ["Peter Camilleri"]
10
+ spec.email = ["peter.c.camilleri@gmail.com"]
11
+ spec.description = "A composable random number generator."
12
+ spec.summary = "A composable random number generation class."
13
+ spec.homepage = "http://teuthida-technologies.com/"
14
+ spec.license = "MIT"
15
+
16
+ raw_list = `git ls-files`.split($/)
17
+ raw_list = raw_list.keep_if {|entry| !entry.start_with?("docs") }
18
+
19
+ spec.files = raw_list
20
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
21
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
22
+ spec.require_paths = ["lib"]
23
+
24
+ spec.required_ruby_version = '>= 1.9.3'
25
+
26
+ spec.add_development_dependency "bundler", "~> 1.3"
27
+ spec.add_development_dependency "rake"
28
+ spec.add_development_dependency 'reek', "~> 1.3.8"
29
+ spec.add_development_dependency 'minitest', "~> 4.7.5"
30
+ spec.add_development_dependency 'rdoc', "~> 4.0.1"
31
+ end
@@ -0,0 +1,32 @@
1
+ require "composite_rng/version"
2
+
3
+ #A class of random number generators that work by nesting other PRNGs.
4
+ class CompositeRng
5
+
6
+ #Create a composite PRNG
7
+ #<br>Parameters
8
+ #* parent - the starting PRNG
9
+ #* 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
13
+ end
14
+
15
+ #An access point for random numbers.
16
+ #<br>Parameters
17
+ #* max - the range of the numbers to be created.
18
+ #<br>Returns
19
+ #* a random value generated according to the max parameter.
20
+ def rand(max=0)
21
+ churn.rand(max)
22
+ end
23
+
24
+ #Stir the soup!
25
+ #<br>Returns
26
+ #* a churned random number generator.
27
+ def churn
28
+ (1 + @parent.rand(@churn)).times {@child.rand(256)}
29
+ @child
30
+ end
31
+
32
+ end
@@ -0,0 +1,4 @@
1
+ class CompositeRng
2
+ #The CompositeRng version.
3
+ VERSION = "0.0.1"
4
+ end
data/reek.txt ADDED
@@ -0,0 +1,2 @@
1
+
2
+ 0 total warnings
@@ -0,0 +1,39 @@
1
+ # coding: utf-8
2
+
3
+ require_relative '../lib/composite_rng'
4
+ require 'minitest/autorun'
5
+
6
+ #Test the monkey patches applied to the Object class.
7
+ class CompositeRngTester < MiniTest::Unit::TestCase
8
+
9
+ #Special initialize to track rake progress.
10
+ def initialize(*all)
11
+ $do_this_only_one_time = "" unless defined? $do_this_only_one_time
12
+
13
+ if $do_this_only_one_time != __FILE__
14
+ puts
15
+ puts "Running test file: #{File.split(__FILE__)[1]}"
16
+ $do_this_only_one_time = __FILE__
17
+ end
18
+
19
+ super(*all)
20
+ end
21
+
22
+ def test_that_it_creates_dice_rolls
23
+ prng = CompositeRng.new(Random.new, Random.new)
24
+
25
+ 100.times do
26
+ assert((0...6) === prng.rand(6))
27
+ end
28
+ end
29
+
30
+ def test_random_string
31
+ prng = CompositeRng.new(Random.new, Random.new)
32
+
33
+ rs = prng.churn.bytes(10)
34
+
35
+ assert(rs.is_a?(String))
36
+ assert_equal(10, rs.length)
37
+ end
38
+
39
+ end
metadata ADDED
@@ -0,0 +1,125 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: composite_rng
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Peter Camilleri
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-12-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: reek
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: 1.3.8
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 1.3.8
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 4.7.5
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: 4.7.5
69
+ - !ruby/object:Gem::Dependency
70
+ name: rdoc
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: 4.0.1
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: 4.0.1
83
+ description: A composable random number generator.
84
+ email:
85
+ - peter.c.camilleri@gmail.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - .gitignore
91
+ - Gemfile
92
+ - LICENSE.txt
93
+ - README.md
94
+ - Rakefile
95
+ - composite_rng.gemspec
96
+ - lib/composite_rng.rb
97
+ - lib/composite_rng/version.rb
98
+ - reek.txt
99
+ - tests/composite_rng_tests.rb
100
+ homepage: http://teuthida-technologies.com/
101
+ licenses:
102
+ - MIT
103
+ metadata: {}
104
+ post_install_message:
105
+ rdoc_options: []
106
+ require_paths:
107
+ - lib
108
+ required_ruby_version: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ! '>='
111
+ - !ruby/object:Gem::Version
112
+ version: 1.9.3
113
+ required_rubygems_version: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ requirements: []
119
+ rubyforge_project:
120
+ rubygems_version: 2.1.4
121
+ signing_key:
122
+ specification_version: 4
123
+ summary: A composable random number generation class.
124
+ test_files: []
125
+ has_rdoc: