ネットの海の片隅で

技術ネタの放流、あるいは不法投棄。

正規乱数を生成するgem「RandomBell」


RubyRandomSecureRandom使



20-30


Lv25

Lv20Lv30




使gem



(一)

(二)

(三)

(四)

(五)


 


Rubygemsrandom_bell
$ gem install random_bell


# Gemfile
gem 'random_bell'
$ bundle install


使

bell = RandomBell.new
bell.rand #=> 0.596308234257563
bell.rand #=> 0.4986734346841275
bell.rand #=> 0.6441978387725272




+0.050: ***
+0.100: *****
+0.150: *********
+0.200: *************
+0.250: **********************
+0.300: **************************
+0.350: **********************************
+0.400: ****************************************
+0.450: ***********************************************
+0.500: *************************************************
+0.550: *************************************************
+0.600: ***********************************************
+0.650: **************************************
+0.700: **********************************
+0.750: **************************
+0.800: *********************
+0.850: *************
+0.900: ********
+0.950: *****
+1.000: ***

bell = RandomBell.new(mu: 0.75)
+0.050:
+0.100:
+0.150:
+0.200:
+0.250: *
+0.300: **
+0.350: *****
+0.400: *********
+0.450: *************
+0.500: ********************
+0.550: ***************************
+0.600: ***********************************
+0.650: ****************************************
+0.700: ************************************************
+0.750: *************************************************
+0.800: *************************************************
+0.850: ********************************************
+0.900: *******************************************
+0.950: ***********************************
+1.000: *************************

bell = RandomBell.new(sigma: 0.5)
+0.050: *******************************
+0.100: *********************************
+0.150: *********************************
+0.200: *************************************
+0.250: ******************************************
+0.300: ********************************************
+0.350: ***********************************************
+0.400: *********************************************
+0.450: *************************************************
+0.500: ***********************************************
+0.550: ************************************************
+0.600: ***********************************************
+0.650: ******************************************
+0.700: ********************************************
+0.750: *********************************************
+0.800: ******************************************
+0.850: ****************************************
+0.900: *****************************************
+0.950: *********************************
+1.000: **********************************

bell = RandomBell.new(range: 0.4..1.2)
+0.440: *********************************************
+0.480: *************************************************
+0.520: **************************************************
+0.560: *************************************************
+0.600: ********************************************
+0.640: *****************************************
+0.680: ***********************************
+0.720: *****************************
+0.760: ************************
+0.800: ********************
+0.840: *************
+0.880: **********
+0.920: *******
+0.960: ****
+1.000: ***
+1.040: *
+1.080: *
+1.120:
+1.160:
+1.200:


3
bell = RandomBell.new(mu: 25, sigma: 2, range: 20..30)
+20.500: **
+21.000: *****
+21.500: *********
+22.000: *************
+22.500: ********************
+23.000: *************************
+23.500: *********************************
+24.000: *************************************
+24.500: ********************************************
+25.000: ************************************************
+25.500: **********************************************
+26.000: *******************************************
+26.500: ****************************************
+27.000: ********************************
+27.500: *************************
+28.000: *******************
+28.500: ************
+29.000: *******
+29.500: *****
+30.000: **




require 'benchmark'
require 'securerandom'
require 'random_bell'

REPEAT = 10 ** 6

Benchmark.bmbm do |b|
  b.report("Random      "){ rand = Random.new ; REPEAT.times{ rand.rand } }
  b.report("SecureRandom"){ REPEAT.times{ SecureRandom.random_number } }
  b.report("RandomBell  "){ rand = RandomBell.new ; REPEAT.times{ rand.rand } }
end

Rehearsal ------------------------------------------------
Random         0.130000   0.000000   0.130000 (  0.131620)
SecureRandom   2.510000   0.010000   2.520000 (  2.546658)
RandomBell     1.290000   0.000000   1.290000 (  1.296140)
--------------------------------------- total: 3.940000sec

                   user     system      total        real
Random         0.090000   0.000000   0.090000 (  0.084740)
SecureRandom   2.210000   0.000000   2.210000 (  2.215300)
RandomBell     1.280000   0.000000   1.280000 (  1.279669)


Random10-15

SecureRandom2




使


https://github.com/s-osa/random_bell 

PR*1



puts bell.to_histogram



f:id:s_osa:20140606115537p:plain
統計学が最強の学問である

*1:返り値が正規分布しているかどうかの検定をするテストとか欲しいですw