diff --git a/src/runner.c b/src/runner.c
index bb5c5cb91c7ca0ab0040f1ff637e124b1c673aeb..99e05de9f6c4932e4428d2a232ff55da8fdba833 100644
--- a/src/runner.c
+++ b/src/runner.c
@@ -1749,7 +1749,8 @@ void *runner_main(void *data) {
   struct runner *r = (struct runner *)data;
   struct engine *e = r->e;
   struct scheduler *sched = &e->sched;
-
+  unsigned int seed = r->id;
+  pthread_setspecific(sched->local_seed_pointer, &seed);
   /* Main loop. */
   while (1) {
 
diff --git a/src/scheduler.c b/src/scheduler.c
index 4081cde0489b1b439ceb46fc9b4e191541f15bef..6705f410f424d1b58c33f4f9ad6cea1bac5eba0f 100644
--- a/src/scheduler.c
+++ b/src/scheduler.c
@@ -1377,7 +1377,9 @@ void scheduler_enqueue(struct scheduler *s, struct task *t) {
     if (qid >= s->nr_queues) error("Bad computed qid.");
 
     /* If no previous owner, pick a random queue. */
-    if (qid < 0) qid = rand() % s->nr_queues;
+    if (qid < 0)
+      qid = rand_r((unsigned int *)pthread_getspecific(s->local_seed_pointer)) %
+            s->nr_queues;
 
     /* Increase the waiting counter. */
     atomic_inc(&s->waiting);
@@ -1609,6 +1611,7 @@ void scheduler_init(struct scheduler *s, struct space *space, int nr_tasks,
   s->size = 0;
   s->tasks = NULL;
   s->tasks_ind = NULL;
+  pthread_key_create(&s->local_seed_pointer, NULL);
   scheduler_reset(s, nr_tasks);
 }
 
diff --git a/src/scheduler.h b/src/scheduler.h
index ac654580b2af2ffb506dc3fd9f0b988b89effbd0..0ef9426ed3248742de619d64f53bdd6b9954ed2c 100644
--- a/src/scheduler.h
+++ b/src/scheduler.h
@@ -102,6 +102,9 @@ struct scheduler {
 
   /* The node we are working on. */
   int nodeID;
+
+  /* 'Pointer' to the seed for the random number generator */
+  pthread_key_t local_seed_pointer;
 };
 
 /* Inlined functions (for speed). */