diff --git a/src/load_balance_schemes.c b/src/load_balance_schemes.c
index 413fc39d4c48c1ea806171b40b7e505ace64fb2c..8ca36896aec53f3bfa6b4c97889f625feffffc31 100644
--- a/src/load_balance_schemes.c
+++ b/src/load_balance_schemes.c
@@ -850,7 +850,7 @@ void nn_main(thread_struct* thread_args_ptr) {
  */
 void nn_worker(thread_struct* thread_args_ptr) {
     int process_rank = thread_args_ptr->thread_num;
-    int nn_counter;
+    int nn_counter = process_rank;
     int main_loop_bool = 1;
     int msg_status_flag;
     int request_flag = -1;
@@ -858,12 +858,13 @@ void nn_worker(thread_struct* thread_args_ptr) {
     int send_status = 1;
     int ten_percent;
     int nn_range;
+    int nn_range_low = process_rank;
+    int nn_range_high = process_rank;
+    int calculate_nn;
+    int index;
 
     log("Starting NN worker.");
 
-    // Initialize random number generator.
-    srand(time(NULL));
-
     // Determine "neighbor" range, based on thread number.
     // Range is [ process_id +- 10%_of_total_processes ]. If hits 0 or max, then loops around.
     ten_percent = thread_args_ptr->total_processors / 10;
@@ -872,6 +873,28 @@ void nn_worker(thread_struct* thread_args_ptr) {
     }
     nn_range = ten_percent * 2;
 
+    for (index = 0; index < nn_range; index++) {
+        nn_range_low -= 1;
+        if (nn_range_low == 0) {
+            nn_range_low = thread_args_ptr->total_processors - 1;
+        }
+
+        nn_range_high = (nn_range_high + 1) % thread_args_ptr->total_processors;
+        if (nn_range_high == 0) {
+            nn_range_high += 1;
+        }
+    }
+
+    char* log_msg = calloc(256, sizeof(char));
+    sprintf(log_msg, "nn_range: %i", nn_range);
+    log(log_msg); free(log_msg);
+    log_msg = calloc(256, sizeof(char));
+    sprintf(log_msg, "nn_range_low: %i", nn_range_low);
+    log(log_msg); free(log_msg);
+    log_msg = calloc(256, sizeof(char));
+    sprintf(log_msg, "nn_range_high: %i", nn_range_high);
+    log(log_msg); free(log_msg);
+
     // Initialize process "1" to have full loads. All others start with none.
     if (process_rank == 1) {
         thread_args_ptr->remaining_loads = thread_args_ptr->total_loads;
@@ -922,12 +945,27 @@ void nn_worker(thread_struct* thread_args_ptr) {
 
         if (request_flag == -1) {
             // Update personal NN counter.
-            nn_counter = thread_args_ptr->thread_num;
-            while (nn_counter == thread_args_ptr->thread_num) {
-                nn_counter = rand() % nn_range;
-                nn_counter = nn_counter + thread_args_ptr->thread_num + 1;
-                if (nn_counter > thread_args_ptr->total_processors - 1) {
-                    nn_counter = (nn_counter % thread_args_ptr->total_processors) + 1;
+            calculate_nn = 1;
+            while (calculate_nn == 1) {
+                nn_counter = (nn_counter + 1) % thread_args_ptr->total_processors;
+                calculate_nn = 0;
+
+                // Check for basic validation.
+                if (nn_counter == 0 || nn_counter == thread_args_ptr->thread_num) {
+                    calculate_nn = 1;
+                }
+
+                // Check for range validation.
+                if (nn_range_low < nn_range_high) {
+                    // Standard value set range. Handle normally.
+                    if (nn_counter < nn_range_low || nn_counter > nn_range_high) {
+                        calculate_nn = 1;
+                    }
+                } else {
+                    // Non-standard value set range. There's an overflow.
+                    if (nn_range_high < nn_counter && nn_counter < nn_range_low) {
+                        calculate_nn = 1;
+                    }
                 }
             }