kirk86:

In that case why do we expect whenever we create an instance of the model multiple times (e.g. modelA = MLP(), modelB = MLP()) to have same weights?


We don’t and it’s expected that sequential calls to the pseudo random number generator will yield different results. Otherwise you would be sampling constant values, which is wrong.
Seeding the code makes sure that the sequence of random numbers are equal between runs.
np.random.seed(2809)
print(np.random.randn(10))
> [ 0.23747478  0.56083014 -1.1650379   0.12482746  0.04529476 -0.60137682
 -0.18559365  0.57410855 -0.53776209 -0.03972935]

print(np.random.randn(10))
> [-0.85086083  0.25095493  0.30150578  1.15011173  0.36414967  0.3197194
 -1.60004496 -0.74648366  0.65739336  0.15710605]

np.random.seed(2809)
print(np.random.randn(10))
> [ 0.23747478  0.56083014 -1.1650379   0.12482746  0.04529476 -0.60137682
 -0.18559365  0.57410855 -0.53776209 -0.03972935]

print(np.random.randn(10))
> [-0.85086083  0.25095493  0.30150578  1.15011173  0.36414967  0.3197194
 -1.60004496 -0.74648366  0.65739336  0.15710605]

The Wikipedia article explains it in more detail.