Inheritance simulator not working properly
There are a couple of things going on here, I think. Let's start with simple conditional probability:
import random

sim1 = [random.choice([0, 1]) for x in range(1000)]
sim2 = [random.choice([0, 1]) for x in range(1000)]
for locus in range(1000):
   if sim1[locus] ==sim2[locus]:
     match+=1
print(match)
# prints 492

In other words, even two completely independent samples from [0,1] with uniform probability are expected to match about half of the time (492 / 1000 ~ 50%).
So you are correct, the problem lies in your fashion of encoding the data. When you are talking about &quot;similarity&quot;, what I think you mean is &quot;identical by descent&quot;. This is distinct from &quot;identical by state&quot;, meaning what actual alleles you have.
Two individuals can be identical by state at a large number of loci without any significantly close family relationship, if they are members of a population without a lot of common alleles. This is close to what we mean when we say that humans are all 99.9% identical to each other- this is because most of the positions in the genome have very little variation. So, if you choose two people who have no common ancestors in the last 1000 generations, they will still be identical by state for &gt;99% of their loci. This is the real lesson that your simulation is showing you, I think!!
If you want to show identity by descent, you will have to choose a different encoding. Using e.g. nucleotides will still run into the problem that very frequently the nucleotides will be identical by state in unrelated individuals, whereas what you actually care about is &quot;did this allele originate from the exact same ancestor&quot;. So you want some way of guaranteeing (or nearly so) that every ancestor contributes a distinctive, unique allele that you can always distinguish. For example, the following code will produce a &quot;unique&quot; identifier that could be used for each founder individual (e.g. every time you call Person():
import uuid 
unique_id = uuid.uuid4()

So really, what your Person.get_random_dna() method should do is something like this (minimal modification to your code):
        def get_random_dna(self):
            unique_id = uuid.uuid4()
            return [unique_id for x in range(CHROMOSONE_LENGTH)]

You may need to fix something else as well, I have not actually run this.