Один из способов сделать это - создать цвета в цветовом пространстве HSV / HSL , а затем преобразовать их в RGB (статья в Википедии рассказывает, как это сделать).
Преимущество HSV состоит в том, что один из компонентов (V) соответствует «яркости». Поэтому, если вы генерируете H, S и V независимо и случайным образом, но ограничиваете V низкими значениями, вы получите темные цвета.