--- nsd-3.2.2/server.c.orig	2009-04-03 20:56:43.000000000 +0900
+++ nsd-3.2.2/server.c	2009-08-20 14:19:52.000000000 +0900
@@ -1222,6 +1222,8 @@
 	assert(nsd->server_kind != NSD_SERVER_MAIN);
 	DEBUG(DEBUG_IPC, 2, (LOG_INFO, "child process started"));
 
+	srandom((unsigned long) getpid() * (unsigned long) time(NULL));
+
 	if (!(nsd->server_kind & NSD_SERVER_TCP)) {
 		close_all_sockets(nsd->tcp, nsd->ifs);
 	}
--- nsd-3.2.2/packet.c.orig	2009-05-06 18:38:32.000000000 +0900
+++ nsd-3.2.2/packet.c	2009-08-20 14:18:37.000000000 +0900
@@ -115,13 +115,15 @@
 	uint16_t added = 0;
 	int all_added = 1;
 	rrset_type *rrsig;
+	uint16_t offset;
 
 	assert(rrset->rr_count > 0);
 
 	truncation_mark = buffer_position(query->packet);
 
+	offset = rrset->rr_count > 1 ? random()%rrset->rr_count : 0;
 	for (i = 0; i < rrset->rr_count; ++i) {
-		if (packet_encode_rr(query, owner, &rrset->rrs[i])) {
+		if (packet_encode_rr(query, owner, &rrset->rrs[rrset->rr_count > 1 ? (i+offset)%rrset->rr_count : i])) {
 			++added;
 		} else {
 			all_added = 0;
