Fortune
This gem allows you calculate the various statistical parameters and values.
Main features of the library are:
P
- ProbabilitiesOdds
- Calculation of oddsA
,Pn
,C
- Combinatorics (accommodation, permutation, combinations)Event
- Random selection of events from the list
Requirements
ruby 1.9 or higher
Installation
Add this line to your application's Gemfile:
gem 'fortune'
And then execute:
$ bundle
Or install it yourself as:
$ gem install fortune
Usage
For Hash
Recalculation of the key values to probability, assuming that P = 1
{:a => 1, :b => 2, :c => 3}.to_p
# => {:a=>0.16666666666666666, :b=>0.3333333333333333, :c=>0.5}
Select random key by value weights
{:a => 1, :b => 2, :c => 3}.choose
# => return :c with 50% probability, :a ~ 16%, :b ~ 33%
Choose from set by value weights
{[:a, :b, :c] => 1, [:d] => 3}.choose_set
# => return :d with 75% probability
Probability
Some methods for P
p = Fortune::P.new(:m => 1, :n => 10)
p = Fortune::P.new(1, 10)
p = Fortune::P.new(0.1)
# => #<Fortune::P:0x00000002316df0 @p=0.1>
p + p # => #<Fortune::P:0x0000000225e890 @p=0.2>
p * p # => #<Fortune::P:0x000000022602a8 @p=0.010000000000000002>
p.to_percent # => 10.0
p.odds # => #<Fortune::Odds:0x0000000230ff50 @p=0.1, @s=1, @k=9.0, @type=:on_win>
p.odds.to_s # => "1:9.0 on_win (p: 10.00%)"
Check event is occured
Fortune::P.is(1,10) # => false (90%)
Select random element
Fortune::P.n(3) # => 1 or 2 or 3
Select random key from array or range by weights (=> weight, ..., P(sum(weights)) = 1)
Fortune::P.n_select(10 => 1, 5 => 1000) # => 4
Fortune::P.n_select((1..10) => 1, (100..200) => 1000) # => 157
Fortune::P.n_select([:a,:b,:c] => 1, [:d,:e] => 1000) # => :d
Odds
Class for odds calculations
odds = Fortune::Odds.new(:win => 5, :lose => 6)
# => #<Fortune::Odds:0x000000026ccf08 @p=0.45454545454545453, @s=5, @k=6, @type=:on_win>
odds_other = Fortune::Odds.new(:s => 5, :k => 7)
# => #<Fortune::Odds:0x00000002706168 @p=0.4166666666666667, @s=5, @k=7, @type=:on_win>
odds > odds_other # => true
odds.variants # => 11
odds.p # => 0.45454545454545453
Large values can be simple converted to human view
Fortune::Odds.new(:win => 1345, :lose => 3623).to_s # => "1345:3623 on_win (p: 27.07%)"
Fortune::Odds.new(:win => 1345, :lose => 3623).to_human.to_s # => "2:5 on_win (p: 28.57%)"
Fortune::Odds.new(:win => 1345, :lose => 3623).to_human(:k => 5, :fractions => true).to_s # => "1.5:4 on_win (p: 27.27%)"
Reverse odds to lose
odds = Fortune::Odds.new(:win => 5, :lose => 6)
# => #<Fortune::Odds:0x00000002822e98 @p=0.45454545454545453, @s=5, @k=6, @type=:on_win>
odds.revert
# => #<Fortune::Odds:0x00000002822e98 @p=0.5454545454545454, @s=6, @k=5, @type=:on_win>
odds.to_lose
# => #<Fortune::Odds:0x00000002822e98 @p=0.5454545454545454, @s=5, @k=6, @type=:on_lose>
Combinatorics
Accomodation (A)
Permutation without repetition with select k elements.
Example: 20 different elements and you need select 5 of them (how many ways of selection exists?). Elements is ordered ([a,b,c] != [b,c,a])
Fortune::A.calc(:elements => 10, :select => 5) # => 30240
Permutation
Permutation without repetition (Pn)
Example: the amount of distributions of the four teams in four places
Fortune::Pn.calc(4) # => 24
other examples
Fortune::Pn.calc(:elements => 5) # => 120
Fortune::Pn.calc(:elements => 5, :select => 2) # => 20
Permutation with repetition (Pnr)
Example: how many different options you can dress up if there are three sweaters two skirts and two hats (3*2*2, if all thing is equal 3, then: Pn_repetition(:n => 3, :k => 3), k - element groups, n - elements count in group)
Fortune::Pn_repetition(:n => 3, :k => 3) # => 27
is equal to
Fortune::Pnr(:groups => 3, :elements => 3) # => 27 (human like variant)
Combinations
Combinations without repetition (C)
Example: 10 different elements (students) and you need select 5 of them (how many ways of selection exists?). Elements does not ordered ([a,b,c] == [b,c,a])
Fortune::C.calc(:elements => 10, :select => 5) # => 252
Combination with repetition (Cr)
Fortune::C_repetition.calc(:elements => 10, :select => 5) # => 2002
same as
Fortune::Cr.calc(:elements => 10, :select => 5) # => 2002
Addon Class Methods
Math.factorial(n)
Event
class - under development
Contributing
- Fork it
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request
Authors
Personal blog author: Malykh Oleg - blog in russian