Blender's rigid body physics are based on game-engine physics. They are built for good performance, with a minimal number of intuitive parameters, for results that look pretty much right in contexts involving solving crate-based puzzles while under attack by headcrabs.
They are only remotely like real-world physics. One reason, already mentioned elsewhere on this page, is that there is some randomness built into the sims, to prevent problems with pencils balancing on their points. Another reason is that states are sampled rather than solving all the calculus problems we'd need to do things realistically. Most visibly we see this problem manifesting in objects teleporting through colliders, but it can also affect bounces.
Consider this starting state for a rigid body sim:
The spheres start in collision with the ground, but at different depths. Let's advance a few frames and see what happens:
The spheres are pushed out of collision, but with different velocities. The one that was deeper has a higher velocity. What's happening? The rigid body sim sees that the spheres are in collision. It pushes them out of collision, creating velocity. That velocity is different for each sphere, because the distance required to push the sphere out of collision is different for each sphere.
Now, what happens when a rigid body sphere rebounds off a wall? The simulation does not see the exact moment that happens; that would require the simulation to solve some calculus problems, potentially, a huge number of them. It sees one subframe, where the body is not in collision, then, the next sub-frame it looks at, the body is in collision. How deep is it in collision? That depends heavily on the body's velocity, but it also depends, artifactually, on when exactly the sub-frame occurred.
Because of that, rebounds in Blender's rigid body system are not perfect. They are just good enough for typical use. They average out to be about realistic. If you need to solve physics problems precisely, you should be using different software to do so.