random_variable 1.1.0 → 1.2.0
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/lib/distros.rb +32 -2
- data/lib/ext/randlib.c +5 -0
- data/lib/ext/random_variable.c +157 -7
- data/lib/ext/xrandlib.c +61 -15
- data/lib/ext/xrandlib.h +8 -3
- data/lib/random_variable.rb +23 -18
- data/lib/sampleable.rb +32 -0
- data/lib/samples.rb +61 -0
- metadata +7 -4
data/lib/distros.rb
CHANGED
@@ -38,6 +38,14 @@ module RandomVariable
|
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
|
+
class ChiSquared < Generic
|
42
|
+
# create a <i>Chi-Squared Random Variable</i> with +k+ degrees
|
43
|
+
# of freedom
|
44
|
+
def self.new(k)
|
45
|
+
intern_new(k)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
41
49
|
class ContinuousUniform < Generic
|
42
50
|
# create a new <i>Continuous Uniform Random Variable</i> with
|
43
51
|
# parameters +a+ and +b+
|
@@ -71,13 +79,21 @@ module RandomVariable
|
|
71
79
|
end
|
72
80
|
|
73
81
|
class Normal < Generic
|
74
|
-
# create a new <i>Normal Random Variable</i>
|
75
|
-
# +mu+ and +sigma+
|
82
|
+
# create a new <i>Normal (aka Gaussian) Random Variable</i>
|
83
|
+
# with parameters +mu+ and +sigma+
|
76
84
|
def self.new(mu = 0.0, sigma = 1.0)
|
77
85
|
intern_new(mu, sigma)
|
78
86
|
end
|
79
87
|
end
|
80
88
|
|
89
|
+
class Pareto < Generic
|
90
|
+
# create a new <i>Pareto Random Variable</i> where +a+ is the
|
91
|
+
# shape and +m+ is the location
|
92
|
+
def self.new(a, m = 1.0)
|
93
|
+
intern_new(a, m)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
81
97
|
class Poisson < Generic
|
82
98
|
# create a new <i>Poisson Random Variable</i> with a mean of
|
83
99
|
# +mean+
|
@@ -86,6 +102,13 @@ module RandomVariable
|
|
86
102
|
end
|
87
103
|
end
|
88
104
|
|
105
|
+
class Rademacher < Generic
|
106
|
+
# create a new <i>Rademacher Random Variable</i>
|
107
|
+
def self.new
|
108
|
+
intern_new
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
89
112
|
class Rayleigh < Generic
|
90
113
|
# create a new <i>Rayleigh Random Variable</i> with parameter
|
91
114
|
# +sigma+
|
@@ -93,4 +116,11 @@ module RandomVariable
|
|
93
116
|
intern_new(sigma)
|
94
117
|
end
|
95
118
|
end
|
119
|
+
|
120
|
+
class Rectangular < Generic
|
121
|
+
# create a <i>Rectangular Random Variable</i>
|
122
|
+
def self.new
|
123
|
+
intern_new
|
124
|
+
end
|
125
|
+
end
|
96
126
|
end
|
data/lib/ext/randlib.c
CHANGED
@@ -1060,6 +1060,11 @@ S170:
|
|
1060
1060
|
}
|
1061
1061
|
|
1062
1062
|
long ignnbn(long n,double p)
|
1063
|
+
/*
|
1064
|
+
return the number of failures
|
1065
|
+
n -> number of successful events
|
1066
|
+
p -> probability of event
|
1067
|
+
*/
|
1063
1068
|
/*
|
1064
1069
|
**********************************************************************
|
1065
1070
|
|
data/lib/ext/random_variable.c
CHANGED
@@ -68,13 +68,18 @@ typedef enum {
|
|
68
68
|
rv_type_bernoulli,
|
69
69
|
rv_type_beta,
|
70
70
|
rv_type_binomial,
|
71
|
+
rv_type_chi_squared,
|
71
72
|
rv_type_continuous_uniform,
|
72
73
|
rv_type_discrete_uniform,
|
73
74
|
rv_type_exponential,
|
74
75
|
rv_type_f,
|
76
|
+
rv_type_negative_binomial,
|
75
77
|
rv_type_normal,
|
78
|
+
rv_type_pareto,
|
76
79
|
rv_type_poisson,
|
80
|
+
rv_type_rademacher,
|
77
81
|
rv_type_rayleigh,
|
82
|
+
rv_type_rectangular,
|
78
83
|
|
79
84
|
/* end of random variable types */
|
80
85
|
|
@@ -92,13 +97,18 @@ typedef struct {
|
|
92
97
|
struct { double p; } bernoulli;
|
93
98
|
struct { double alpha, beta; } beta;
|
94
99
|
struct { long n; double p; } binomial;
|
100
|
+
struct { long k; } chi_squared;
|
95
101
|
struct { double a,b; } continuous_uniform;
|
96
102
|
struct { long a,b; } discrete_uniform;
|
97
103
|
struct { double mean; } exponential;
|
98
104
|
struct { double d1, d2; } f;
|
105
|
+
struct { long r; double p; } negative_binomial;
|
99
106
|
struct { double mu, sigma; } normal;
|
107
|
+
struct { double a, m; } pareto;
|
100
108
|
struct { double mean; } poisson;
|
109
|
+
struct { /* no params */ } rademacher;
|
101
110
|
struct { double sigma; } rayleigh;
|
111
|
+
struct { /* no params */ } rectangular;
|
102
112
|
} RANDVAR_DATA; /* union */
|
103
113
|
} randvar_t;
|
104
114
|
#define RANDVAR_ALLOC() ALLOC(randvar_t)
|
@@ -118,6 +128,13 @@ typedef struct {
|
|
118
128
|
rv->RANDVAR_DATA . name . param = param; \
|
119
129
|
}
|
120
130
|
|
131
|
+
#define CREATE_RANDVAR_OUTCOME_FUNC0(name, func, type) \
|
132
|
+
static inline type \
|
133
|
+
randvar_##name ##_ ##outcome(randvar_t *rv) \
|
134
|
+
{ \
|
135
|
+
return func(); \
|
136
|
+
}
|
137
|
+
|
121
138
|
#define CREATE_RANDVAR_OUTCOME_FUNC1(name, func, type, param) \
|
122
139
|
static inline type \
|
123
140
|
randvar_##name ##_ ##outcome(randvar_t *rv) \
|
@@ -160,6 +177,11 @@ CREATE_RANDVAR_ACCESSOR(binomial, n, long)
|
|
160
177
|
CREATE_RANDVAR_ACCESSOR(binomial, p, double)
|
161
178
|
CREATE_RANDVAR_OUTCOME_FUNC2(binomial, ignbin, long, n, p)
|
162
179
|
CREATE_RANDVAR_RB_OUTCOME(binomial, LONG2NUM)
|
180
|
+
/* chi-squared */
|
181
|
+
RV_NR_PARAMS(chi_squared, 1)
|
182
|
+
CREATE_RANDVAR_ACCESSOR(chi_squared, k, long)
|
183
|
+
CREATE_RANDVAR_OUTCOME_FUNC1(chi_squared, gen_chi_squared, double, k)
|
184
|
+
CREATE_RANDVAR_RB_OUTCOME(chi_squared, DBL2NUM)
|
163
185
|
/* continuous uniform */
|
164
186
|
RV_NR_PARAMS(continuous_uniform, 2)
|
165
187
|
CREATE_RANDVAR_ACCESSOR(continuous_uniform, a, double)
|
@@ -170,7 +192,7 @@ CREATE_RANDVAR_RB_OUTCOME(continuous_uniform, DBL2NUM)
|
|
170
192
|
RV_NR_PARAMS(discrete_uniform, 2)
|
171
193
|
CREATE_RANDVAR_ACCESSOR(discrete_uniform, a, long)
|
172
194
|
CREATE_RANDVAR_ACCESSOR(discrete_uniform, b, long)
|
173
|
-
CREATE_RANDVAR_OUTCOME_FUNC2(discrete_uniform,
|
195
|
+
CREATE_RANDVAR_OUTCOME_FUNC2(discrete_uniform, gen_discrete_uniform, long, a, b)
|
174
196
|
CREATE_RANDVAR_RB_OUTCOME(discrete_uniform, LONG2NUM)
|
175
197
|
/* exponential */
|
176
198
|
RV_NR_PARAMS(exponential, 1)
|
@@ -183,22 +205,42 @@ CREATE_RANDVAR_ACCESSOR(f, d1, double)
|
|
183
205
|
CREATE_RANDVAR_ACCESSOR(f, d2, double)
|
184
206
|
CREATE_RANDVAR_OUTCOME_FUNC2(f, genf, double, d1, d2)
|
185
207
|
CREATE_RANDVAR_RB_OUTCOME(f, DBL2NUM)
|
208
|
+
/* negative binomial */
|
209
|
+
RV_NR_PARAMS(negative_binomial, 2)
|
210
|
+
CREATE_RANDVAR_ACCESSOR(negative_binomial, r, long)
|
211
|
+
CREATE_RANDVAR_ACCESSOR(negative_binomial, p, double)
|
212
|
+
CREATE_RANDVAR_OUTCOME_FUNC2(negative_binomial, ignnbn, long, r, p)
|
213
|
+
CREATE_RANDVAR_RB_OUTCOME(negative_binomial, LONG2NUM)
|
186
214
|
/* normal */
|
187
215
|
RV_NR_PARAMS(normal, 2)
|
188
216
|
CREATE_RANDVAR_ACCESSOR(normal, mu, double)
|
189
217
|
CREATE_RANDVAR_ACCESSOR(normal, sigma, double)
|
190
218
|
CREATE_RANDVAR_OUTCOME_FUNC2(normal, gennor, double, mu, sigma)
|
191
219
|
CREATE_RANDVAR_RB_OUTCOME(normal, DBL2NUM)
|
220
|
+
/* pareto */
|
221
|
+
RV_NR_PARAMS(pareto, 2)
|
222
|
+
CREATE_RANDVAR_ACCESSOR(pareto, a, double)
|
223
|
+
CREATE_RANDVAR_ACCESSOR(pareto, m, double)
|
224
|
+
CREATE_RANDVAR_OUTCOME_FUNC2(pareto, gen_pareto, double, a, m)
|
225
|
+
CREATE_RANDVAR_RB_OUTCOME(pareto, DBL2NUM)
|
192
226
|
/* poisson */
|
193
227
|
RV_NR_PARAMS(poisson, 1)
|
194
228
|
CREATE_RANDVAR_ACCESSOR(poisson, mean, double)
|
195
229
|
CREATE_RANDVAR_OUTCOME_FUNC1(poisson, ignpoi, long, mean)
|
196
230
|
CREATE_RANDVAR_RB_OUTCOME(poisson, LONG2NUM)
|
231
|
+
/* rademacher */
|
232
|
+
RV_NR_PARAMS(rademacher, 0)
|
233
|
+
CREATE_RANDVAR_OUTCOME_FUNC0(rademacher, gen_rademacher, int)
|
234
|
+
CREATE_RANDVAR_RB_OUTCOME(rademacher, INT2FIX)
|
197
235
|
/* rayleigh */
|
198
236
|
RV_NR_PARAMS(rayleigh, 1)
|
199
237
|
CREATE_RANDVAR_ACCESSOR(rayleigh, sigma, double)
|
200
238
|
CREATE_RANDVAR_OUTCOME_FUNC1(rayleigh, gen_rayleigh, double, sigma)
|
201
239
|
CREATE_RANDVAR_RB_OUTCOME(rayleigh, DBL2NUM)
|
240
|
+
/* rectangular */
|
241
|
+
RV_NR_PARAMS(rectangular, 0)
|
242
|
+
CREATE_RANDVAR_OUTCOME_FUNC0(rectangular, gen_rectangular, double)
|
243
|
+
CREATE_RANDVAR_RB_OUTCOME(rectangular, DBL2NUM)
|
202
244
|
|
203
245
|
/******************************************************************************/
|
204
246
|
/* class and module objects */
|
@@ -267,6 +309,15 @@ static type_t type(VALUE rb_obj)
|
|
267
309
|
#x " parameter " \
|
268
310
|
"is not a " \
|
269
311
|
"probability"); \
|
312
|
+
} while (0)
|
313
|
+
|
314
|
+
#define CHECK_PROBABILITY_EXCL(x) \
|
315
|
+
do { \
|
316
|
+
if (x >= 1.0 || x <= 0.0) \
|
317
|
+
rb_raise(rb_eArgError, \
|
318
|
+
#x " parameter " \
|
319
|
+
"must be " \
|
320
|
+
"0 < " #x " < 1"); \
|
270
321
|
} while (0)
|
271
322
|
|
272
323
|
#define VAR_DECLARATIONS va_list ap; \
|
@@ -275,6 +326,15 @@ static type_t type(VALUE rb_obj)
|
|
275
326
|
VALUE klass = 0;
|
276
327
|
#define SET_KLASS(name) \
|
277
328
|
(klass = rb_cRandomVariables[rv_type_ ##name])
|
329
|
+
|
330
|
+
#define ASSERT_KLASS_IS_SET \
|
331
|
+
do { \
|
332
|
+
if (0 == klass) \
|
333
|
+
rb_bug("forgot to set klass variable " \
|
334
|
+
"in %s()", __func__); \
|
335
|
+
} while (0)
|
336
|
+
|
337
|
+
|
278
338
|
#define GET_NEXT_ARG(ap) va_arg((ap), VALUE)
|
279
339
|
#define CREATE_WRAPPING(rv) Data_Wrap_Struct(klass, NULL, xfree, (rv))
|
280
340
|
|
@@ -294,6 +354,7 @@ static type_t type(VALUE rb_obj)
|
|
294
354
|
{
|
295
355
|
|
296
356
|
#define CASE_END \
|
357
|
+
ASSERT_KLASS_IS_SET; \
|
297
358
|
break; \
|
298
359
|
}
|
299
360
|
/******************************************************************************/
|
@@ -375,6 +436,25 @@ VALUE rb_create_instance(VALUE rb_obj, ...)
|
|
375
436
|
SET_PARAM(binomial, p);
|
376
437
|
CASE_END
|
377
438
|
|
439
|
+
CASE(chi_squared)
|
440
|
+
VALUE rb_k;
|
441
|
+
long k;
|
442
|
+
|
443
|
+
SET_KLASS(chi_squared);
|
444
|
+
|
445
|
+
rb_k = GET_NEXT_ARG(ap);
|
446
|
+
CHECK_RB_INTEGER(rb_k, "k");
|
447
|
+
|
448
|
+
k = NUM2LONG(rb_k);
|
449
|
+
|
450
|
+
/* k > 0 */
|
451
|
+
CHECK_POSITIVE(k);
|
452
|
+
|
453
|
+
/* k parameter correct */
|
454
|
+
RANDVAR_INIT(chi_squared);
|
455
|
+
SET_PARAM(chi_squared, k);
|
456
|
+
CASE_END
|
457
|
+
|
378
458
|
CASE(continuous_uniform)
|
379
459
|
VALUE rb_a, rb_b;
|
380
460
|
double a,b;
|
@@ -460,6 +540,34 @@ VALUE rb_create_instance(VALUE rb_obj, ...)
|
|
460
540
|
SET_PARAM(f, d2);
|
461
541
|
CASE_END
|
462
542
|
|
543
|
+
CASE(negative_binomial)
|
544
|
+
VALUE rb_r, rb_p;
|
545
|
+
long r;
|
546
|
+
double p;
|
547
|
+
|
548
|
+
SET_KLASS(negative_binomial);
|
549
|
+
|
550
|
+
rb_r = GET_NEXT_ARG(ap);
|
551
|
+
rb_p = GET_NEXT_ARG(ap);
|
552
|
+
|
553
|
+
CHECK_RB_INTEGER(rb_r, "r");
|
554
|
+
|
555
|
+
r = NUM2LONG(rb_r);
|
556
|
+
p = NUM2DBL(rb_p);
|
557
|
+
|
558
|
+
/* r > 0 */
|
559
|
+
CHECK_POSITIVE(r);
|
560
|
+
/* 0 < p < 0 */
|
561
|
+
CHECK_PROBABILITY_EXCL(p);
|
562
|
+
|
563
|
+
/* r and p parameters correct */
|
564
|
+
RANDVAR_INIT(negative_binomial);
|
565
|
+
SET_PARAM(negative_binomial, r);
|
566
|
+
SET_PARAM(negative_binomial, p);
|
567
|
+
|
568
|
+
|
569
|
+
CASE_END
|
570
|
+
|
463
571
|
CASE(normal)
|
464
572
|
VALUE rb_mu, rb_sigma;
|
465
573
|
double mu, sigma;
|
@@ -478,6 +586,30 @@ VALUE rb_create_instance(VALUE rb_obj, ...)
|
|
478
586
|
RANDVAR_INIT(normal);
|
479
587
|
SET_PARAM(normal, mu);
|
480
588
|
SET_PARAM(normal, sigma);
|
589
|
+
CASE_END
|
590
|
+
|
591
|
+
CASE(pareto)
|
592
|
+
VALUE rb_a, rb_m;
|
593
|
+
double a, m;
|
594
|
+
|
595
|
+
SET_KLASS(pareto);
|
596
|
+
|
597
|
+
rb_a = GET_NEXT_ARG(ap);
|
598
|
+
rb_m = GET_NEXT_ARG(ap);
|
599
|
+
|
600
|
+
a = NUM2DBL(rb_a);
|
601
|
+
m = NUM2DBL(rb_m);
|
602
|
+
|
603
|
+
/* a > 0 */
|
604
|
+
CHECK_POSITIVE(a);
|
605
|
+
|
606
|
+
/* m > 0 */
|
607
|
+
CHECK_POSITIVE(m);
|
608
|
+
|
609
|
+
/* a and m parameters correct */
|
610
|
+
RANDVAR_INIT(pareto);
|
611
|
+
SET_PARAM(pareto, a);
|
612
|
+
SET_PARAM(pareto, m);
|
481
613
|
CASE_END
|
482
614
|
|
483
615
|
CASE(poisson)
|
@@ -489,11 +621,17 @@ VALUE rb_create_instance(VALUE rb_obj, ...)
|
|
489
621
|
rb_mean = GET_NEXT_ARG(ap);
|
490
622
|
mean = NUM2DBL(rb_mean);
|
491
623
|
/* mean > 0 */
|
492
|
-
CHECK_POSITIVE(mean)
|
624
|
+
CHECK_POSITIVE(mean);
|
493
625
|
|
494
626
|
/* mean parameter correct */
|
495
627
|
RANDVAR_INIT(poisson);
|
496
|
-
SET_PARAM(poisson, mean)
|
628
|
+
SET_PARAM(poisson, mean);
|
629
|
+
CASE_END
|
630
|
+
|
631
|
+
CASE(rademacher)
|
632
|
+
SET_KLASS(rademacher);
|
633
|
+
|
634
|
+
RANDVAR_INIT(rademacher);
|
497
635
|
CASE_END
|
498
636
|
|
499
637
|
CASE(rayleigh)
|
@@ -512,6 +650,12 @@ VALUE rb_create_instance(VALUE rb_obj, ...)
|
|
512
650
|
SET_PARAM(rayleigh, sigma);
|
513
651
|
CASE_END
|
514
652
|
|
653
|
+
CASE(rectangular)
|
654
|
+
SET_KLASS(rectangular);
|
655
|
+
|
656
|
+
RANDVAR_INIT(rectangular);
|
657
|
+
CASE_END
|
658
|
+
|
515
659
|
default:
|
516
660
|
rb_rv = Qnil;
|
517
661
|
|
@@ -607,11 +751,12 @@ static VALUE rb_seed_set(VALUE self, VALUE rb_seed)
|
|
607
751
|
(VALUE (*) (ANYARGS)) rb_create_instance, \
|
608
752
|
rv_ ##name ##_nr_params); \
|
609
753
|
\
|
610
|
-
|
611
|
-
|
754
|
+
rb_define_private_method(*rb_objp, \
|
755
|
+
"intern_outcome", rb_outcome, 0); \
|
756
|
+
\
|
757
|
+
rb_define_private_method(*rb_objp, \
|
758
|
+
"intern_outcomes", rb_outcomes, 1); \
|
612
759
|
\
|
613
|
-
rb_define_method(*rb_objp, "outcomes", rb_outcomes, 1); \
|
614
|
-
rb_define_alias(*rb_objp, "samples", "outcomes"); \
|
615
760
|
outcome_func[rv_type_ ##name] = \
|
616
761
|
randvar_ ##name ##_rb_outcome; \
|
617
762
|
} while (0)
|
@@ -637,13 +782,18 @@ void Init_random_variable(void)
|
|
637
782
|
CREATE_RANDOM_VARIABLE_CLASS("Bernoulli", bernoulli);
|
638
783
|
CREATE_RANDOM_VARIABLE_CLASS("Beta", beta);
|
639
784
|
CREATE_RANDOM_VARIABLE_CLASS("Binomial", binomial);
|
785
|
+
CREATE_RANDOM_VARIABLE_CLASS("ChiSquared", chi_squared);
|
640
786
|
CREATE_RANDOM_VARIABLE_CLASS("ContinuousUniform", continuous_uniform);
|
641
787
|
CREATE_RANDOM_VARIABLE_CLASS("DiscreteUniform", discrete_uniform);
|
642
788
|
CREATE_RANDOM_VARIABLE_CLASS("Exponential", exponential);
|
643
789
|
CREATE_RANDOM_VARIABLE_CLASS("F", f);
|
790
|
+
CREATE_RANDOM_VARIABLE_CLASS("NegativeBinomial", negative_binomial);
|
644
791
|
CREATE_RANDOM_VARIABLE_CLASS("Normal", normal);
|
792
|
+
CREATE_RANDOM_VARIABLE_CLASS("Pareto", pareto);
|
645
793
|
CREATE_RANDOM_VARIABLE_CLASS("Poisson", poisson);
|
794
|
+
CREATE_RANDOM_VARIABLE_CLASS("Rademacher", rademacher);
|
646
795
|
CREATE_RANDOM_VARIABLE_CLASS("Rayleigh", rayleigh);
|
796
|
+
CREATE_RANDOM_VARIABLE_CLASS("Rectangular", rectangular);
|
647
797
|
|
648
798
|
/* initialize the random number generator */
|
649
799
|
rv_init_gen();
|
data/lib/ext/xrandlib.c
CHANGED
@@ -40,6 +40,19 @@
|
|
40
40
|
#include "xrandlib.h"
|
41
41
|
#include "randlib.h"
|
42
42
|
|
43
|
+
/* Arcsine */
|
44
|
+
double gen_arcsine(void)
|
45
|
+
{
|
46
|
+
return pow(sin(M_2_PI * ranf() ), 2);
|
47
|
+
}
|
48
|
+
|
49
|
+
/* Bates */
|
50
|
+
double gen_bates(long n)
|
51
|
+
{
|
52
|
+
return genirwinhall(n) / n;
|
53
|
+
}
|
54
|
+
|
55
|
+
/* Bernoulli */
|
43
56
|
int gen_bernoulli(double p)
|
44
57
|
{
|
45
58
|
if (ranf() > p)
|
@@ -47,22 +60,35 @@ int gen_bernoulli(double p)
|
|
47
60
|
return 1;
|
48
61
|
}
|
49
62
|
|
50
|
-
/*
|
51
|
-
double
|
52
|
-
{
|
53
|
-
return sigma * sqrt(-2 * log(1.0 - ranf()));
|
54
|
-
}
|
55
|
-
|
56
|
-
/* Arcsine */
|
57
|
-
double gen_arcsine(void)
|
63
|
+
/* Chi-Squared */
|
64
|
+
double gen_chi_squared(long k)
|
58
65
|
{
|
59
|
-
return
|
66
|
+
return genchi((double) k);
|
60
67
|
}
|
61
68
|
|
62
|
-
/*
|
63
|
-
|
69
|
+
/* Discrete Uniform */
|
70
|
+
long gen_discrete_uniform(long a, long b)
|
64
71
|
{
|
65
|
-
|
72
|
+
/* assumptions:
|
73
|
+
1) a != b
|
74
|
+
2) a < b
|
75
|
+
*/
|
76
|
+
double step;
|
77
|
+
long step_nr;
|
78
|
+
double y, y0;
|
79
|
+
|
80
|
+
step = 1.0 / (b - a + 1);
|
81
|
+
y = step;
|
82
|
+
y0 = ranf();
|
83
|
+
step_nr = 0;
|
84
|
+
|
85
|
+
do {
|
86
|
+
if (y0 <= y)
|
87
|
+
break;
|
88
|
+
y += step;
|
89
|
+
++step_nr;
|
90
|
+
} while (1);
|
91
|
+
return a + step_nr;
|
66
92
|
}
|
67
93
|
|
68
94
|
/* Irwin-Hall */
|
@@ -75,10 +101,30 @@ double gen_irwin_hall(long n)
|
|
75
101
|
return sum;
|
76
102
|
}
|
77
103
|
|
78
|
-
/*
|
79
|
-
|
104
|
+
/* Rademacher */
|
105
|
+
int gen_rademacher(void)
|
80
106
|
{
|
81
|
-
|
107
|
+
if (ranf() <= 0.5)
|
108
|
+
return -1;
|
109
|
+
return 1;
|
110
|
+
}
|
111
|
+
|
112
|
+
/* Rayleigh */
|
113
|
+
double gen_rayleigh(double sigma)
|
114
|
+
{
|
115
|
+
return sigma * sqrt(-2 * log(1.0 - ranf()));
|
116
|
+
}
|
117
|
+
|
118
|
+
/* Pareto */
|
119
|
+
double gen_pareto(double a, double m)
|
120
|
+
{
|
121
|
+
return m * pow(1 - ranf(), 1.0 / a);
|
122
|
+
}
|
123
|
+
|
124
|
+
/* Rectangular */
|
125
|
+
double gen_rectangular(void)
|
126
|
+
{
|
127
|
+
return (ranf() - 0.5);
|
82
128
|
}
|
83
129
|
|
84
130
|
/* Triangular */
|
data/lib/ext/xrandlib.h
CHANGED
@@ -17,8 +17,13 @@
|
|
17
17
|
#ifndef _XRANDLIB_H_
|
18
18
|
#define _XRANDLIB_H_
|
19
19
|
|
20
|
-
extern int
|
21
|
-
extern double
|
22
|
-
extern
|
20
|
+
extern int gen_bernoulli(double);
|
21
|
+
extern double gen_chi_squared(long);
|
22
|
+
extern long gen_discrete_uniform(long a, long b);
|
23
|
+
extern double gen_exponential(double);
|
24
|
+
extern double gen_pareto(double, double);
|
25
|
+
extern int gen_rademacher(void);
|
26
|
+
extern double gen_rayleigh(double);
|
27
|
+
extern double gen_rectangular(void);
|
23
28
|
|
24
29
|
#endif /* _XRANDLIB_H_ */
|
data/lib/random_variable.rb
CHANGED
@@ -32,6 +32,7 @@
|
|
32
32
|
=end
|
33
33
|
|
34
34
|
require_relative 'ext/random_variable'
|
35
|
+
require_relative 'sampleable'
|
35
36
|
|
36
37
|
module RandomVariable
|
37
38
|
# obtain the current seed in use
|
@@ -63,14 +64,34 @@ module RandomVariable
|
|
63
64
|
distros
|
64
65
|
end
|
65
66
|
|
66
|
-
class Generic
|
67
|
+
class Generic
|
68
|
+
include Sampleable
|
69
|
+
|
67
70
|
klass = self
|
68
71
|
|
69
72
|
def initialize(&blk)
|
70
73
|
@blk = blk
|
74
|
+
|
75
|
+
class << self
|
76
|
+
def outcome
|
77
|
+
@blk.call
|
78
|
+
end
|
79
|
+
alias :sample :outcome
|
80
|
+
|
81
|
+
def outcomes(nr_samples)
|
82
|
+
ary = []
|
83
|
+
nr_samples.times do
|
84
|
+
ary << @blk.call
|
85
|
+
end
|
86
|
+
class << ary
|
87
|
+
include RandomVariable::Samples
|
88
|
+
end
|
89
|
+
ary
|
90
|
+
end
|
91
|
+
alias :samples :outcomes
|
92
|
+
end
|
71
93
|
end
|
72
94
|
|
73
|
-
|
74
95
|
operators = %w(+ - * / % **)
|
75
96
|
|
76
97
|
operators.each do |op|
|
@@ -85,22 +106,6 @@ module RandomVariable
|
|
85
106
|
end
|
86
107
|
end
|
87
108
|
|
88
|
-
# obtain a single outcome from the random variable
|
89
|
-
def outcome
|
90
|
-
@blk.call
|
91
|
-
end
|
92
|
-
alias :sample :outcome
|
93
|
-
|
94
|
-
# obtain +number+ outcomes from the random variable
|
95
|
-
def outcomes(number)
|
96
|
-
ary = []
|
97
|
-
number.times do
|
98
|
-
ary << @blk.call
|
99
|
-
end
|
100
|
-
ary
|
101
|
-
end
|
102
|
-
alias :samples :outcomes
|
103
|
-
|
104
109
|
end
|
105
110
|
end
|
106
111
|
|
data/lib/sampleable.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
################################################################################
|
2
|
+
# #
|
3
|
+
# File: sampleable.rb #
|
4
|
+
# #
|
5
|
+
################################################################################
|
6
|
+
# #
|
7
|
+
# Author: Jorge F.M. Rinaldi #
|
8
|
+
# Contact: jorge.madronal.rinaldi@gmail.com #
|
9
|
+
# #
|
10
|
+
################################################################################
|
11
|
+
# #
|
12
|
+
# Date: 2012/12/02 #
|
13
|
+
# #
|
14
|
+
################################################################################
|
15
|
+
|
16
|
+
require_relative 'samples'
|
17
|
+
|
18
|
+
module RandomVariable::Sampleable
|
19
|
+
def outcome
|
20
|
+
intern_outcome
|
21
|
+
end
|
22
|
+
alias :sample :outcome
|
23
|
+
|
24
|
+
def outcomes(nr_samples)
|
25
|
+
samples_ary = intern_outcomes(nr_samples)
|
26
|
+
class << samples_ary
|
27
|
+
include RandomVariable::Samples
|
28
|
+
end
|
29
|
+
samples_ary
|
30
|
+
end
|
31
|
+
alias :samples :outcomes
|
32
|
+
end
|
data/lib/samples.rb
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
################################################################################
|
2
|
+
# #
|
3
|
+
# File: samples.rb #
|
4
|
+
# #
|
5
|
+
################################################################################
|
6
|
+
# #
|
7
|
+
# Author: Jorge F.M. Rinaldi #
|
8
|
+
# Contact: jorge.madronal.rinaldi@gmail.com #
|
9
|
+
# #
|
10
|
+
################################################################################
|
11
|
+
# #
|
12
|
+
# Date: 2012/12/02 #
|
13
|
+
# #
|
14
|
+
################################################################################
|
15
|
+
|
16
|
+
module RandomVariable::Samples
|
17
|
+
def iterate_samples
|
18
|
+
self.each_with_index do |sample, i|
|
19
|
+
if block_given? then
|
20
|
+
yield(sample, i)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def max
|
26
|
+
cur_max = self[0]
|
27
|
+
self.iterate_samples do |sample|
|
28
|
+
cur_max = sample if sample > cur_max
|
29
|
+
end
|
30
|
+
cur_max
|
31
|
+
end
|
32
|
+
|
33
|
+
def min
|
34
|
+
cur_min = self[0]
|
35
|
+
self.iterate_samples do |sample|
|
36
|
+
cur_min = sample if sample < cur_min
|
37
|
+
end
|
38
|
+
cur_min
|
39
|
+
end
|
40
|
+
|
41
|
+
def mean
|
42
|
+
return nil if 0 == self.size
|
43
|
+
acc = 0.0
|
44
|
+
self.iterate_samples do |sample|
|
45
|
+
acc += sample
|
46
|
+
end
|
47
|
+
acc / self.size
|
48
|
+
end
|
49
|
+
|
50
|
+
def median
|
51
|
+
return nil if 0 == self.size
|
52
|
+
return self[0] if 1 == self.size
|
53
|
+
ary = self.sort
|
54
|
+
i = ary.len / 2
|
55
|
+
if ary.len.even? then
|
56
|
+
return (ary[i] + ary[i-1]) / 2.0
|
57
|
+
else
|
58
|
+
return ary[i]
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: random_variable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,9 +9,10 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-12-
|
12
|
+
date: 2012-12-15 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
|
-
description:
|
14
|
+
description: Probability distributions such as the Binomial, Beta, Chi-Squared, Normal,
|
15
|
+
Pareto, Poisson, etc.
|
15
16
|
email: jorge.madronal.rinaldi@gmail.com
|
16
17
|
executables: []
|
17
18
|
extensions:
|
@@ -20,6 +21,8 @@ extra_rdoc_files: []
|
|
20
21
|
files:
|
21
22
|
- lib/random_variable.rb
|
22
23
|
- lib/ext/extconf.rb
|
24
|
+
- lib/samples.rb
|
25
|
+
- lib/sampleable.rb
|
23
26
|
- lib/distros.rb
|
24
27
|
- LICENSE
|
25
28
|
- COPYING
|
@@ -56,5 +59,5 @@ rubyforge_project:
|
|
56
59
|
rubygems_version: 1.8.24
|
57
60
|
signing_key:
|
58
61
|
specification_version: 3
|
59
|
-
summary: Random Variables in Ruby
|
62
|
+
summary: Random Variables in Ruby for a wide variety of probability distributions
|
60
63
|
test_files: []
|