Skip to content

Commit f81caec

Browse files
authored
Merge pull request #202 from namannimmo10/random
Initial implementation of the `random` module
2 parents 69c255f + 66bcf26 commit f81caec

File tree

5 files changed

+104
-0
lines changed

5 files changed

+104
-0
lines changed

integration_tests/run_tests.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"modules_01.py",
1717
#"modules_02.py",
1818
"test_math.py",
19+
"test_random.py",
1920
"test_builtin.py",
2021
"test_builtin_abs.py",
2122
"test_builtin_bool.py",

integration_tests/test_random.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
from ltypes import i32, f64
2+
import random
3+
4+
5+
def test_random():
6+
r: f64
7+
r = random.random()
8+
print(r)
9+
assert r >= 0.0 and r < 1.0
10+
r = random.random()
11+
print(r)
12+
assert r >= 0.0 and r < 1.0
13+
14+
def test_randrange():
15+
r: i32
16+
r = random.randrange(0, 10) # [0, 10)
17+
print(r)
18+
assert r >= 0 and r < 10
19+
r = random.randrange(-50, 76) # [-50, 76)
20+
print(r)
21+
assert r >= -50 and r < 76
22+
23+
def test_randint():
24+
ri1: i32
25+
ri2: i32
26+
ri1 = random.randint(0, 10) # [0, 10]
27+
print(ri1)
28+
assert ri1 >= 0 and ri1 <= 10
29+
ri2 = random.randint(-50, 76) # [-50, 76]
30+
print(ri2)
31+
assert ri2 >= -50 and ri2 <= 76
32+
33+
def test_paretovariate():
34+
r: f64
35+
r = random.paretovariate(2.0)
36+
print(r)
37+
r = random.paretovariate(-5.6)
38+
print(r)
39+
40+
test_random()
41+
test_randrange()
42+
test_randint()
43+
test_paretovariate()

src/runtime/impure/lfortran_intrinsics.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,23 @@ LFORTRAN_API void _lfortran_random_number(int n, double *v)
3030
}
3131
}
3232

33+
LFORTRAN_API float _lfortran_random_float()
34+
{
35+
return ((float) rand() / (float) RAND_MAX);
36+
}
37+
38+
LFORTRAN_API int _lfortran_randrange(int lower, int upper)
39+
{
40+
int rr = lower + (rand() % (upper - lower));
41+
return rr;
42+
}
43+
44+
LFORTRAN_API int _lfortran_random_int(int lower, int upper)
45+
{
46+
int randint = lower + (rand() % (upper - lower + 1));
47+
return randint;
48+
}
49+
3350
LFORTRAN_API void _lfortran_printf(const char* format, ...)
3451
{
3552
va_list args;

src/runtime/impure/lfortran_intrinsics.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ typedef double _Complex double_complex_t;
3131

3232
LFORTRAN_API double _lfortran_sum(int n, double *v);
3333
LFORTRAN_API void _lfortran_random_number(int n, double *v);
34+
LFORTRAN_API float _lfortran_random_float();
35+
LFORTRAN_API int _lfortran_randrange(int lower, int upper);
36+
LFORTRAN_API int _lfortran_random_int(int lower, int upper);
3437
LFORTRAN_API void _lfortran_printf(const char* format, ...);
3538
LFORTRAN_API void _lfortran_complex_add(struct _lfortran_complex* a,
3639
struct _lfortran_complex* b, struct _lfortran_complex *result);

src/runtime/random.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
from ltypes import i32, f64, ccall
2+
3+
4+
def random() -> f64:
5+
"""
6+
Returns a random floating point number in the range [0.0, 1.0)
7+
"""
8+
return _lfortran_random_float()
9+
10+
@ccall
11+
def _lfortran_random_float() -> f64:
12+
pass
13+
14+
def randrange(lower: i32, upper: i32) -> i32:
15+
"""
16+
Return a random integer N such that `lower <= N < upper`.
17+
"""
18+
return _lfortran_randrange(lower, upper)
19+
20+
@ccall
21+
def _lfortran_randrange(lower: i32, upper: i32) -> i32:
22+
pass
23+
24+
def randint(lower: i32, upper: i32) -> i32:
25+
"""
26+
Return a random integer N such that `lower <= N <= upper`.
27+
"""
28+
return _lfortran_random_int(lower, upper)
29+
30+
@ccall
31+
def _lfortran_random_int(lower: i32, upper: i32) -> i32:
32+
pass
33+
34+
def paretovariate(alpha: f64) -> f64:
35+
"""
36+
Return a random number from a Pareto distribution with parameter `alpha`.
37+
"""
38+
u: f64
39+
u = 1.0 - random()
40+
return u ** (-1.0 / alpha)

0 commit comments

Comments
 (0)