EEPROM wear levelling

As code (using an array rather than EEPROM for clarity):

#define N ... whatever ....
int prev_value;  // whatever was written last
int eeprom[N] ;  // simulated EEPROM, N is size in units (here int)
int addr ;       // write pointer, advances round-robin fashion

void setup()
{
  prev_value = read_value() ;
  addr = random (0..N-1) ;   // tricky part is seeding this random number
}

int read_value ()
{
  int value = 0 ;
  for (int i = 0 ; i < N ; i++)
    value ^= eeprom[i] ;
  return value;
}

void write_new_value(int new_value)
{
  eeprom[addr] = eeprom[addr] ^ prev_value ^ new_value ;  // single write only.
  prev_value = new_value ;
  addr += 1 ;
  if (addr >= N)
    addr = 0 ;
}

Some details I glossed over, like addressing for multibyte entries in the EEPROM, randomizing well at startup.

You could lose the global prev_value and rescan the whole eeprom each time to calculate it when writing if you wanted.