Skip to content

Commit

Permalink
Merge pull request lcompilers#2318 from OmarMesqq/feat/improve-random…
Browse files Browse the repository at this point in the history
…-seed-entropy

Implement random.seed()
  • Loading branch information
certik committed Oct 17, 2023
2 parents 9b5f52f + 805b621 commit 8aaa4a7
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 0 deletions.
28 changes: 28 additions & 0 deletions integration_tests/test_random.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,33 @@ def test_weibullvariate():
r = random.weibullvariate(-5.6, 1.2)
print(r)

def test_seed():
random.seed()
t6: f64 = random.random()
random.seed(123)
t1: f64
t1 = random.random()
random.seed(321)
t2: f64
t2 = random.random()
random.seed(123)
t3: f64
t3 = random.random()
random.seed(0)
t4: f64
t4 = random.random()
random.seed(0)
t5: f64
t5 = random.random()
random.seed()
t7: f64 = random.random()
assert t1 != t2
assert t1 == t3
assert t1 != t4
assert t1 != t5
assert t4 == t5
assert t6 != t7

def check():
test_random()
test_randrange()
Expand All @@ -60,5 +87,6 @@ def check():
test_paretovariate()
test_expovariate()
test_weibullvariate()
test_seed()

check()
10 changes: 10 additions & 0 deletions src/libasr/runtime/lfortran_intrinsics.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,16 @@ LFORTRAN_API void _lfortran_random_number(int n, double *v)
}
}

LFORTRAN_API void _lfortran_init_random_seed(unsigned seed)
{
srand(seed);
}

LFORTRAN_API void _lfortran_init_random_clock()
{
srand((unsigned int)clock());
}

LFORTRAN_API double _lfortran_random()
{
return (rand() / (double) RAND_MAX);
Expand Down
2 changes: 2 additions & 0 deletions src/libasr/runtime/lfortran_intrinsics.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@ typedef double _Complex double_complex_t;

LFORTRAN_API double _lfortran_sum(int n, double *v);
LFORTRAN_API void _lfortran_random_number(int n, double *v);
LFORTRAN_API void _lfortran_init_random_clock();
LFORTRAN_API void _lfortran_init_random_seed(unsigned seed);
LFORTRAN_API double _lfortran_random();
LFORTRAN_API int _lfortran_randrange(int lower, int upper);
LFORTRAN_API int _lfortran_random_int(int lower, int upper);
Expand Down
24 changes: 24 additions & 0 deletions src/runtime/random.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,30 @@ def random() -> f64:
def _lfortran_random() -> f64:
pass

@overload
def seed() -> None:
"""
Initializes the random number generator.
"""
_lfortran_init_random_clock()
return

@overload
def seed(seed: i32) -> None:
"""
Initializes the random number generator.
"""
_lfortran_init_random_seed(seed)
return

@ccall
def _lfortran_init_random_clock() -> None:
pass

@ccall
def _lfortran_init_random_seed(seed: i32) -> None:
pass

def randrange(lower: i32, upper: i32) -> i32:
"""
Return a random integer N such that `lower <= N < upper`.
Expand Down

0 comments on commit 8aaa4a7

Please sign in to comment.