Use point buy. There really isn't another solution.
Even if dice are all rolled in front of the DM and five sworn witnesses under laboratory-random conditions, the dice CAN end up giving one player all 3's and another player all 18's.
In the end, what ultimately really matters is how close the players are to each other in overall ability scores. My first 3.0E campaign, I let players roll their own, outside of sight, and one player ended up with the equivalent of like a 47 point buy character and another player had the equivlaent of a 22 point buy character. With most tending toward the low end. The 47 pointer was a half-orc barbarian and they TOTALLY dominated combat. This made it very hard to balance encounters, because what would challenge the rest of the party this barbarian could kill by himself without breaking a sweat and what would challenge the barbarian would just kill the entire rest of the party if the barbarian didn't get there first. This started to level off a bit with higher levels, but it never went away entirely.
Point buy is fair and it means that the group will end up with evenly matched characters. This makes just about everything else in the entire game go more smoothly.
Leaving the stats to pure random chance that is then frozen for the entire life of the character is to me like having massive tables of backgrounds and personality characteristics and just rolling for those as well - but then you no longer are creating your character, you are just letting a computer create it for you.