diff --git a/src/runner.c b/src/runner.c
index 512a4f362fe80caf0441c191f5503e94aec7e763..dc6cc865a64f9ffb873c22060fca544d017341eb 100644
--- a/src/runner.c
+++ b/src/runner.c
@@ -1656,7 +1656,8 @@ void *runner_main(void *data) {
   struct runner *r = (struct runner *)data;
   struct engine *e = r->e;
   struct scheduler *sched = &e->sched;
-
+  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 62fce53762e0b3c84396dfb9c54190199b41753b..b75119ffba1171fc8f91ae34f192cb6bd82c455c 100644
--- a/src/scheduler.c
+++ b/src/scheduler.c
@@ -1305,7 +1305,7 @@ 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((int*)pthread_getspecific(s->local_seed_pointer) ) % s->nr_queues;
 
     /* Increase the waiting counter. */
     atomic_inc(&s->waiting);
@@ -1537,6 +1537,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);
   scheduler_reset(s, nr_tasks);
 }
 
diff --git a/src/scheduler.h b/src/scheduler.h
index f2225f5f5b8d0a5db54eb8506e02d78b14f4bb88..24bf5f105dbb299153d5dc29d29faeb9240e73f4 100644
--- a/src/scheduler.h
+++ b/src/scheduler.h
@@ -102,6 +102,8 @@ struct scheduler {
 
   /* The node we are working on. */
   int nodeID;
+
+  pthread_key_t local_seed_pointer;
 };
 
 /* Inlined functions (for speed). */