Depending on the classroom level (I teach at university, so undergrad and grad level), I pair students based on ability (high, low, mixed) and acquaintance level (friends, acquaintances, etc.). And from time to time, I use think-pair-share as well.
For classroom projects at the graduate level, I typically pair students with a high intelligence level (but low presentation skills) with those with better presentation skills (and somewhat lower academic potential). This way the group members work much better, compensating for each other's deficiencies and highlighting each other's expertise.
To enhance classroom success, I pair students randomly as thinking pairs who share their results with each other. I give different numerical problems to each group and allow 10-15 minutes of time, during which the pairs will work together and share their ideas while getting feedback from each other. This was very popular during a course last term that threw engineers and microbiologists together in my class. For numericals based on microbial kinetics, I paired each engineer with a microbiologist. To achieve results, microbiologists had to provide concepts and engineers their analytical skills.
To promote classroom harmony, I usually pair students with non-acquaintances, especially for my UG (undergrad level) courses. Although it has been shown that friends when paired work better, in professional life people often work as part of a multi-disciplinary team and to ensure their success in later life, I pair students with non-acquaintances. This is especially useful for elective courses where the enrollment comprises students from various backgrounds.