Skip to content

Commit 8aaa4a7

Browse files
authored
Merge pull request #2318 from OmarMesqq/feat/improve-random-seed-entropy
Implement random.seed()
2 parents 9b5f52f + 805b621 commit 8aaa4a7

File tree

4 files changed

+64
-0
lines changed

4 files changed

+64
-0
lines changed

integration_tests/test_random.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,33 @@ def test_weibullvariate():
5252
r = random.weibullvariate(-5.6, 1.2)
5353
print(r)
5454

55+
def test_seed():
56+
random.seed()
57+
t6: f64 = random.random()
58+
random.seed(123)
59+
t1: f64
60+
t1 = random.random()
61+
random.seed(321)
62+
t2: f64
63+
t2 = random.random()
64+
random.seed(123)
65+
t3: f64
66+
t3 = random.random()
67+
random.seed(0)
68+
t4: f64
69+
t4 = random.random()
70+
random.seed(0)
71+
t5: f64
72+
t5 = random.random()
73+
random.seed()
74+
t7: f64 = random.random()
75+
assert t1 != t2
76+
assert t1 == t3
77+
assert t1 != t4
78+
assert t1 != t5
79+
assert t4 == t5
80+
assert t6 != t7
81+
5582
def check():
5683
test_random()
5784
test_randrange()
@@ -60,5 +87,6 @@ def check():
6087
test_paretovariate()
6188
test_expovariate()
6289
test_weibullvariate()
90+
test_seed()
6391

6492
check()

src/libasr/runtime/lfortran_intrinsics.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,16 @@ LFORTRAN_API void _lfortran_random_number(int n, double *v)
9696
}
9797
}
9898

99+
LFORTRAN_API void _lfortran_init_random_seed(unsigned seed)
100+
{
101+
srand(seed);
102+
}
103+
104+
LFORTRAN_API void _lfortran_init_random_clock()
105+
{
106+
srand((unsigned int)clock());
107+
}
108+
99109
LFORTRAN_API double _lfortran_random()
100110
{
101111
return (rand() / (double) RAND_MAX);

src/libasr/runtime/lfortran_intrinsics.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ typedef double _Complex double_complex_t;
6767

6868
LFORTRAN_API double _lfortran_sum(int n, double *v);
6969
LFORTRAN_API void _lfortran_random_number(int n, double *v);
70+
LFORTRAN_API void _lfortran_init_random_clock();
71+
LFORTRAN_API void _lfortran_init_random_seed(unsigned seed);
7072
LFORTRAN_API double _lfortran_random();
7173
LFORTRAN_API int _lfortran_randrange(int lower, int upper);
7274
LFORTRAN_API int _lfortran_random_int(int lower, int upper);

src/runtime/random.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,30 @@ def random() -> f64:
3232
def _lfortran_random() -> f64:
3333
pass
3434

35+
@overload
36+
def seed() -> None:
37+
"""
38+
Initializes the random number generator.
39+
"""
40+
_lfortran_init_random_clock()
41+
return
42+
43+
@overload
44+
def seed(seed: i32) -> None:
45+
"""
46+
Initializes the random number generator.
47+
"""
48+
_lfortran_init_random_seed(seed)
49+
return
50+
51+
@ccall
52+
def _lfortran_init_random_clock() -> None:
53+
pass
54+
55+
@ccall
56+
def _lfortran_init_random_seed(seed: i32) -> None:
57+
pass
58+
3559
def randrange(lower: i32, upper: i32) -> i32:
3660
"""
3761
Return a random integer N such that `lower <= N < upper`.

0 commit comments

Comments
 (0)