fibonacci_rng 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/lib/fibonacci_rng/version.rb +1 -1
- data/lib/fibonacci_rng.rb +8 -3
- data/prng.rb +79 -0
- data/tests/fibinacci_rng_tests.rb +10 -0
- data/tools/auto_corr.rb +29 -0
- data/tools/chi_squared.rb +35 -0
- data/tools/internal_rng.rb +16 -0
- metadata +5 -1
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NTJlYjNlYzYxMGMxMzAyOTk2MmEyYWM2OWI5N2RlN2JhMWQ5ZDQ3OA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
OGQxYWNhZjViOTA5MjYzNDI0OTNkZTgxMTllNmYyOWRkNmQ5MDUwMA==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZTlhNWYzYzRjOTQ0OTljMjE5ZGM4NjA1NTZlNDkxNTc4ZDNjYmE3NGJiM2Yy
|
10
|
+
YzFjZTA2YzM1ZWJhZDdiMWNlZWIxY2YyYWU1ODNiNjY4ZWVmNWZhOTQyNmE2
|
11
|
+
NjI1N2RjMzZlNWY1NThkMWZjZTJhMTRjMDgyN2QwMjhhYmQxZmY=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZmU1MGRmYzE4OTk2MTUyOGUzNTExNjMwNzdjYWFkM2ZkYTIxNmZlZmQxOGJm
|
14
|
+
MTkxY2NjYzIyNzYxNzBjN2M5NzMwMmM5YjY5M2FmMDVhNjZjNGU5NDMzOTVm
|
15
|
+
MDM4ZWIwNThhNzJhN2NhNGViYzQ1MjY4NzUwMThmYmM1NjdlZGM=
|
data/lib/fibonacci_rng.rb
CHANGED
@@ -13,10 +13,10 @@ class FibonacciRng
|
|
13
13
|
Time.now.to_s + @tickle.succ!
|
14
14
|
end
|
15
15
|
|
16
|
-
CHOP =
|
16
|
+
CHOP = 0x1FFFFFFF
|
17
17
|
BYTE = 0xFF
|
18
18
|
WORD = 0xFFFF
|
19
|
-
BASE =
|
19
|
+
BASE = (CHOP+1).to_f
|
20
20
|
|
21
21
|
#An accessor for the depth!
|
22
22
|
attr_reader :depth
|
@@ -38,7 +38,12 @@ class FibonacciRng
|
|
38
38
|
|
39
39
|
#Roll a dice.
|
40
40
|
def dice(sides)
|
41
|
-
|
41
|
+
limit = ((CHOP+1) / sides) * sides
|
42
|
+
|
43
|
+
begin
|
44
|
+
do_spin
|
45
|
+
end until @buffer[0] < limit
|
46
|
+
|
42
47
|
@buffer[0] % sides
|
43
48
|
end
|
44
49
|
|
data/prng.rb
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
#The Pseudo Random Number Generation Test Suite.
|
4
|
+
module PrngTestSuite
|
5
|
+
|
6
|
+
#Display usage info and exit
|
7
|
+
def self.usage(msg=nil)
|
8
|
+
puts
|
9
|
+
puts "PrngTestSuite Version 0.0.2"
|
10
|
+
|
11
|
+
if msg
|
12
|
+
puts
|
13
|
+
puts msg
|
14
|
+
end
|
15
|
+
|
16
|
+
puts
|
17
|
+
puts "Usage Info:"
|
18
|
+
puts
|
19
|
+
puts "$ ruby prng.rb <locn> <gen> <test> <max> <count>"
|
20
|
+
puts
|
21
|
+
puts "Where:"
|
22
|
+
puts " <locn> fib code location, either 'gem' or 'local'"
|
23
|
+
puts " <gen> select a generator, either 'fib' or 'int'"
|
24
|
+
puts " <test> select a test, either 'chisq' or 'auto'"
|
25
|
+
puts " <max> the number of bins to test (2..65535)"
|
26
|
+
puts " <count> the number of samples to test (1..1000000)"
|
27
|
+
puts
|
28
|
+
|
29
|
+
exit
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
if ARGV[0] == 'gem'
|
35
|
+
require 'fibonacci_rng'
|
36
|
+
elsif ARGV[0] == 'local'
|
37
|
+
require_relative 'lib/fibonacci_rng'
|
38
|
+
elsif ARGV[0] == 'help'
|
39
|
+
PrngTestSuite.usage
|
40
|
+
else
|
41
|
+
PrngTestSuite.usage "Error: missing or invalid locn parameter."
|
42
|
+
end
|
43
|
+
|
44
|
+
require_relative 'tools/internal_rng'
|
45
|
+
require_relative 'tools/chi_squared'
|
46
|
+
require_relative 'tools/auto_corr'
|
47
|
+
|
48
|
+
module PrngTestSuite
|
49
|
+
|
50
|
+
def self.main
|
51
|
+
if ARGV[1] == 'fib'
|
52
|
+
gen = FibonacciRng.new
|
53
|
+
elsif ARGV[1] == 'int'
|
54
|
+
gen = InternalRng.new
|
55
|
+
else
|
56
|
+
PrngTestSuite.usage "Error: missing or invalid gen parameter."
|
57
|
+
end
|
58
|
+
|
59
|
+
if ARGV[2] == 'chisq'
|
60
|
+
tester = ChiSquaredTest.new
|
61
|
+
elsif ARGV[2] == 'auto'
|
62
|
+
tester = AutoCorrelator.new
|
63
|
+
else
|
64
|
+
PrngTestSuite.usage "Error: missing or invalid test parameter."
|
65
|
+
end
|
66
|
+
|
67
|
+
unless (2..65535) === (max = ARGV[3].to_i)
|
68
|
+
PrngTestSuite.usage "Error: missing or invalid max parameter."
|
69
|
+
end
|
70
|
+
|
71
|
+
unless (1..10000000) === (count = ARGV[4].to_i)
|
72
|
+
PrngTestSuite.usage "Error: missing or invalid count parameter."
|
73
|
+
end
|
74
|
+
|
75
|
+
tester.run(gen, max, count)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
PrngTestSuite.main
|
@@ -44,6 +44,16 @@ class CoreTester < MiniTest::Unit::TestCase
|
|
44
44
|
|
45
45
|
end
|
46
46
|
|
47
|
+
def test_that_it_creates_floats
|
48
|
+
prng = FibonacciRng.new
|
49
|
+
|
50
|
+
100.times do
|
51
|
+
value = prng.float
|
52
|
+
assert((value >= 0.0) && (value < 1.0))
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
47
57
|
def test_that_it_makes_unique_sequnces
|
48
58
|
prnga = FibonacciRng.new
|
49
59
|
prngb = FibonacciRng.new
|
data/tools/auto_corr.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
class AutoCorrelator
|
4
|
+
|
5
|
+
#Run a auto correlation test on the random number generator.
|
6
|
+
def run(gen, _width, count)
|
7
|
+
data = Array.new(2*count) { gen.float - 0.5}
|
8
|
+
result = Array.new(count)
|
9
|
+
|
10
|
+
(0..count).each do |lag|
|
11
|
+
result[lag] = correlate(data, count, lag)
|
12
|
+
end
|
13
|
+
|
14
|
+
puts result
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
#Perform a single correlation
|
19
|
+
def correlate(data, count, lag)
|
20
|
+
result = 0.0
|
21
|
+
|
22
|
+
(0...count).each do |idx|
|
23
|
+
result += data[idx] * data[idx+lag]
|
24
|
+
end
|
25
|
+
|
26
|
+
result
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
#A Chi Squared tester
|
4
|
+
class ChiSquaredTest
|
5
|
+
|
6
|
+
#Run a chi squared test on the random number generator.
|
7
|
+
def run(gen, bin_size, count)
|
8
|
+
max = bin_size
|
9
|
+
bins = Array.new(bin_size, 0)
|
10
|
+
|
11
|
+
start_time = Time.now
|
12
|
+
puts "Starting test"
|
13
|
+
|
14
|
+
count.times do
|
15
|
+
bins[gen.dice(max)] += 1
|
16
|
+
end
|
17
|
+
|
18
|
+
puts "Test completed (#{Time.now - start_time} elapsed)"
|
19
|
+
puts "Raw Bins = #{bins.inspect}"
|
20
|
+
|
21
|
+
normalized = bins.collect {|value| value.to_f/count }
|
22
|
+
|
23
|
+
#puts "Nrm Bins = #{normalized.inspect}"
|
24
|
+
|
25
|
+
expected = 1/max.to_f
|
26
|
+
#puts "Expected = #{expected}"
|
27
|
+
|
28
|
+
err_sqr = normalized.collect{|value| diff = expected - value; diff*diff}
|
29
|
+
#puts "Esq Bins = #{err_sqr.inspect}"
|
30
|
+
|
31
|
+
chi_sq = err_sqr.inject {|sum, value| sum + value}
|
32
|
+
puts "Chi Squared = #{chi_sq}"
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fibonacci_rng
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Camilleri
|
@@ -82,8 +82,12 @@ files:
|
|
82
82
|
- fibonacci_rng.gemspec
|
83
83
|
- lib/fibonacci_rng.rb
|
84
84
|
- lib/fibonacci_rng/version.rb
|
85
|
+
- prng.rb
|
85
86
|
- reek.txt
|
86
87
|
- tests/fibinacci_rng_tests.rb
|
88
|
+
- tools/auto_corr.rb
|
89
|
+
- tools/chi_squared.rb
|
90
|
+
- tools/internal_rng.rb
|
87
91
|
homepage: ''
|
88
92
|
licenses:
|
89
93
|
- MIT
|