bernoulli 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.
- data/README.md +40 -0
- data/Rakefile +10 -0
- data/bernoulli.gemspec +24 -0
- data/lib/bernoulli/math.rb +17 -0
- data/lib/bernoulli.rb +36 -0
- data/test/test_bernoulli.rb +43 -0
- metadata +51 -0
data/README.md
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
|
2
|
+
# Bernoulli : A Ruby library for the binomial distribution
|
3
|
+
|
4
|
+
In probability theory and statistics, the **binomial distribution** is the discrete probability distribution of the number of successes in a sequence of *n* independent yes/no experiments, each of which yields success with probability *p*.
|
5
|
+
|
6
|
+
You can read more about **Bernoulli trials** and the **binomial distribution** [on Wikipedia](http://en.wikipedia.org/wiki/Binomial_distribution).
|
7
|
+
|
8
|
+
## Installation
|
9
|
+
|
10
|
+
Use RubyGems to install `bernoulli`
|
11
|
+
|
12
|
+
$ gem install bernoulli
|
13
|
+
|
14
|
+
## Uses
|
15
|
+
|
16
|
+
Using `bernoulli`, one can calculate the probabilities of bernoulli experiments.
|
17
|
+
|
18
|
+
### Example Usage
|
19
|
+
|
20
|
+
**Question:** What is the chance of getting between 25 and 36 6's when one rolls a die 180 times? What is the expected value and variance of this trial?
|
21
|
+
|
22
|
+
Let's use `bernoulli` to solve this:
|
23
|
+
|
24
|
+
First we load up `irb` from the terminal including `bernoulli` as a library
|
25
|
+
|
26
|
+
$ irb -r bernoulli
|
27
|
+
|
28
|
+
Or we could just include `require 'bernoulli'` in any Ruby script
|
29
|
+
|
30
|
+
Then we create a new instance of class Bernoulli and calculate our desired probability and properties
|
31
|
+
|
32
|
+
b = Bernoulli.new(180, 1.0/6)
|
33
|
+
# => #<Bernoulli:0x007fba721a1bf0 @n=180, @p=0.16666666666666666>
|
34
|
+
|
35
|
+
# The probability of getting between 25 and 36 sixes is
|
36
|
+
b[25..36] # => 0.7665588897840108
|
37
|
+
|
38
|
+
b.expected_value # => 30.0
|
39
|
+
b.variance # => 25.0
|
40
|
+
|
data/Rakefile
ADDED
data/bernoulli.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
|
2
|
+
Gem::Specification.new do |spec|
|
3
|
+
|
4
|
+
spec.files = [
|
5
|
+
'README.md',
|
6
|
+
'Rakefile',
|
7
|
+
'bernoulli.gemspec',
|
8
|
+
'lib/bernoulli.rb',
|
9
|
+
'lib/bernoulli/math.rb',
|
10
|
+
'test/test_bernoulli.rb'
|
11
|
+
]
|
12
|
+
spec.name = 'bernoulli'
|
13
|
+
spec.summary = 'Bernoulli process library'
|
14
|
+
spec.version = '0.0.1'
|
15
|
+
|
16
|
+
spec.date = '2012-05-24'
|
17
|
+
spec.description = "A Library that allows calculation of probibilities and properties of Bernoulli processes like coin tossing"
|
18
|
+
|
19
|
+
spec.author = 'Mikael Konutgan'
|
20
|
+
spec.homepage = 'https://github.com/mkonutgan'
|
21
|
+
spec.email = 'mkonutgan@shortmail.com'
|
22
|
+
|
23
|
+
end
|
24
|
+
|
data/lib/bernoulli.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
|
2
|
+
require 'bernoulli/math'
|
3
|
+
|
4
|
+
class Bernoulli
|
5
|
+
|
6
|
+
def initialize(n, p)
|
7
|
+
@n = n
|
8
|
+
@p = p
|
9
|
+
end
|
10
|
+
|
11
|
+
def probability(k)
|
12
|
+
Math.binomial(@n, k) * @p**k * (1 - @p)**(@n - k)
|
13
|
+
end
|
14
|
+
|
15
|
+
def [](k)
|
16
|
+
if k.is_a? Integer
|
17
|
+
self.probability(k).to_f
|
18
|
+
elsif k.is_a? Range
|
19
|
+
sum = 0
|
20
|
+
k.each do |i|
|
21
|
+
sum += self.probability(i)
|
22
|
+
end
|
23
|
+
sum.to_f
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def expected_value
|
28
|
+
@n * @p
|
29
|
+
end
|
30
|
+
|
31
|
+
def variance
|
32
|
+
@n * @p * (1 - @p)
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
@@ -0,0 +1,43 @@
|
|
1
|
+
|
2
|
+
require 'test/unit'
|
3
|
+
require 'bernoulli'
|
4
|
+
|
5
|
+
class BernoulliTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def test_factorial
|
8
|
+
assert_equal 1, Math.factorial(0)
|
9
|
+
assert_equal 1, Math.factorial(1)
|
10
|
+
assert_equal 120, Math.factorial(5)
|
11
|
+
assert_equal 263130836933693530167218012160000000, Math.factorial(32)
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_binomial
|
15
|
+
assert_equal 1, Math.binomial(0, 0)
|
16
|
+
(1..10).each do |k|
|
17
|
+
assert_equal 1, Math.binomial(k, 0)
|
18
|
+
assert_equal 1, Math.binomial(k, k)
|
19
|
+
assert_equal k, Math.binomial(k, 1)
|
20
|
+
assert_equal k, Math.binomial(k, k - 1)
|
21
|
+
end
|
22
|
+
assert_equal 100947, Math.binomial(23, 17)
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_coin_toss
|
26
|
+
p = Bernoulli.new(2, 0.5)
|
27
|
+
assert_equal 0.5, p[1]
|
28
|
+
assert_equal 0.25, p[2]
|
29
|
+
assert_equal 1.0, p[0..2]
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_expected_value
|
33
|
+
p = Bernoulli.new(180, 1.0/6)
|
34
|
+
assert_equal 30, p.expected_value
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_variance
|
38
|
+
p = Bernoulli.new(180, 1.0/6)
|
39
|
+
assert_equal 25, p.variance
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
metadata
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: bernoulli
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Mikael Konutgan
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-05-24 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: A Library that allows calculation of probibilities and properties of
|
15
|
+
Bernoulli processes like coin tossing
|
16
|
+
email: mkonutgan@shortmail.com
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- README.md
|
22
|
+
- Rakefile
|
23
|
+
- bernoulli.gemspec
|
24
|
+
- lib/bernoulli.rb
|
25
|
+
- lib/bernoulli/math.rb
|
26
|
+
- test/test_bernoulli.rb
|
27
|
+
homepage: https://github.com/mkonutgan
|
28
|
+
licenses: []
|
29
|
+
post_install_message:
|
30
|
+
rdoc_options: []
|
31
|
+
require_paths:
|
32
|
+
- lib
|
33
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
35
|
+
requirements:
|
36
|
+
- - ! '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ! '>='
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '0'
|
45
|
+
requirements: []
|
46
|
+
rubyforge_project:
|
47
|
+
rubygems_version: 1.8.24
|
48
|
+
signing_key:
|
49
|
+
specification_version: 3
|
50
|
+
summary: Bernoulli process library
|
51
|
+
test_files: []
|