The key difference here is that every player is forced to give money each tick, whereas in your implementation players are randomly selected to give money. The following implementation does yield an exponential distribution:
for _ in range(10000):
for i in range(N_players):
if W[i] > 0:
j = np.random.randint(N_players)
W[i] -= 1
W[j] += 1
Fwiw your implementation will also relax towards an exponential distribution (try 10000000 iterations); it just converges at a different rate.