| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
4 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -30,14 +30,41 @@ def test_randint(): | |||
| 30 | 30 | print(ri2) | |
| 31 | 31 | assert ri2 >= -50 and ri2 <= 76 | |
| 32 | 32 | ||
| 33 | + def test_uniform(): | ||
| 34 | + r: f64 | ||
| 35 | + r = random.uniform(5., 76.) | ||
| 36 | + print(r) | ||
| 37 | + r = random.uniform(-50., 76.) | ||
| 38 | + print(r) | ||
| 39 | + | ||
| 33 | 40 | def test_paretovariate(): | |
| 34 | 41 | r: f64 | |
| 35 | 42 | r = random.paretovariate(2.0) | |
| 36 | 43 | print(r) | |
| 37 | 44 | r = random.paretovariate(-5.6) | |
| 38 | 45 | print(r) | |
| 39 | 46 | ||
| 40 | - test_random() | ||
| 41 | - test_randrange() | ||
| 42 | - test_randint() | ||
| 43 | - test_paretovariate() | ||
| 47 | + def test_expovariate(): | ||
| 48 | + r: f64 | ||
| 49 | + r = random.expovariate(2.0) | ||
| 50 | + print(r) | ||
| 51 | + r = random.expovariate(-5.6) | ||
| 52 | + print(r) | ||
| 53 | + | ||
| 54 | + def test_weibullvariate(): | ||
| 55 | + r: f64 | ||
| 56 | + r = random.weibullvariate(2.0, 3.0) | ||
| 57 | + print(r) | ||
| 58 | + r = random.weibullvariate(-5.6, 1.2) | ||
| 59 | + print(r) | ||
| 60 | + | ||
| 61 | + def check(): | ||
| 62 | + test_random() | ||
| 63 | + test_randrange() | ||
| 64 | + test_randint() | ||
| 65 | + test_uniform() | ||
| 66 | + test_paretovariate() | ||
| 67 | + test_expovariate() | ||
| 68 | + test_weibullvariate() | ||
| 69 | + | ||
| 70 | + check() | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -30,9 +30,9 @@ LFORTRAN_API void _lfortran_random_number(int n, double *v) | |||
| 30 | 30 | } | |
| 31 | 31 | } | |
| 32 | 32 | ||
| 33 | - LFORTRAN_API float _lfortran_random_float() | ||
| 33 | + LFORTRAN_API double _lfortran_random() | ||
| 34 | 34 | { | |
| 35 | - return ((float) rand() / (float) RAND_MAX); | ||
| 35 | + return (rand() / (double) RAND_MAX); | ||
| 36 | 36 | } | |
| 37 | 37 | ||
| 38 | 38 | LFORTRAN_API int _lfortran_randrange(int lower, int upper) | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -31,7 +31,7 @@ typedef double _Complex double_complex_t; | |||
| 31 | 31 | ||
| 32 | 32 | LFORTRAN_API double _lfortran_sum(int n, double *v); | |
| 33 | 33 | LFORTRAN_API void _lfortran_random_number(int n, double *v); | |
| 34 | - LFORTRAN_API float _lfortran_random_float(); | ||
| 34 | + LFORTRAN_API double _lfortran_random(); | ||
| 35 | 35 | LFORTRAN_API int _lfortran_randrange(int lower, int upper); | |
| 36 | 36 | LFORTRAN_API int _lfortran_random_int(int lower, int upper); | |
| 37 | 37 | LFORTRAN_API void _lfortran_printf(const char* format, ...); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1,14 +1,35 @@ | |||
| 1 | 1 | from ltypes import i32, f64, ccall | |
| 2 | 2 | ||
| 3 | + e: f64 = 2.718281828459045235360287471352662497757 | ||
| 4 | + eps: f64 = 1e-16 | ||
| 5 | + | ||
| 6 | + #: TODO: Call `log` from C directly until we fix the multiple import issue | ||
| 7 | + def _log(x: f64) -> f64: | ||
| 8 | + return _lfortran_dlog(x) | ||
| 9 | + | ||
| 10 | + @ccall | ||
| 11 | + def _lfortran_dlog(x: f64) -> f64: | ||
| 12 | + pass | ||
| 13 | + | ||
| 14 | + def _exp(x: f64) -> f64: | ||
| 15 | + return e**x | ||
| 16 | + | ||
| 17 | + def _sqrt(x: f64) -> f64: | ||
| 18 | + return x**(1/2) | ||
| 19 | + | ||
| 20 | + def _abs(x: f64) -> f64: | ||
| 21 | + if x < 0.0: | ||
| 22 | + return -x | ||
| 23 | + return x | ||
| 3 | 24 | ||
| 4 | 25 | def random() -> f64: | |
| 5 | 26 | """ | |
| 6 | 27 | Returns a random floating point number in the range [0.0, 1.0) | |
| 7 | 28 | """ | |
| 8 | - return _lfortran_random_float() | ||
| 29 | + return _lfortran_random() | ||
| 9 | 30 | ||
| 10 | 31 | @ccall | |
| 11 | - def _lfortran_random_float() -> f64: | ||
| 32 | + def _lfortran_random() -> f64: | ||
| 12 | 33 | pass | |
| 13 | 34 | ||
| 14 | 35 | def randrange(lower: i32, upper: i32) -> i32: | |
@@ -31,10 +52,32 @@ def randint(lower: i32, upper: i32) -> i32: | |||
| 31 | 52 | def _lfortran_random_int(lower: i32, upper: i32) -> i32: | |
| 32 | 53 | pass | |
| 33 | 54 | ||
| 55 | + def uniform(a: f64, b: f64) -> f64: | ||
| 56 | + """ | ||
| 57 | + Get a random number in the range [a, b) or [a, b] depending on rounding. | ||
| 58 | + """ | ||
| 59 | + return a + (b - a) * random() | ||
| 60 | + | ||
| 34 | 61 | def paretovariate(alpha: f64) -> f64: | |
| 35 | 62 | """ | |
| 36 | 63 | Return a random number from a Pareto distribution with parameter `alpha`. | |
| 37 | 64 | """ | |
| 38 | 65 | u: f64 | |
| 39 | 66 | u = 1.0 - random() | |
| 40 | 67 | return u ** (-1.0 / alpha) | |
| 68 | + | ||
| 69 | + def expovariate(l: f64) -> f64: | ||
| 70 | + """ | ||
| 71 | + Return a random number from an exponential distribution with parameter | ||
| 72 | + `l` (lambda). | ||
| 73 | + """ | ||
| 74 | + assert _abs(l) > eps | ||
| 75 | + return -_log(1.0 - random()) / l | ||
| 76 | + | ||
| 77 | + def weibullvariate(alpha: f64, beta: f64) -> f64: | ||
| 78 | + """ | ||
| 79 | + Return a random number from a Weibull distribution with parameters `alpha` | ||
| 80 | + and `beta`. | ||
| 81 | + """ | ||
| 82 | + assert _abs(beta) > eps | ||
| 83 | + return alpha * (-_log(1.0 - random())) ** (1.0 / beta) | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments