Can your question be rephrased as:
"For each of ten randomly selected providers, find one randomly selected deal offered by that provider" ?
If so, that pretty much tells you what to do. You need two layers, one pass to randomly select ten providers, then one pass to select one random deal per provider.
Given dummy data:
create table spam ( deal text, provider text );
insert into spam(deal,provider)
SELECT prov_id||n::text, prov_id FROM (
SELECT chr(x) AS prov_id from generate_series(97, 92+26) x) y
CROSS JOIN generate_series(1,10) n;
select provider FROM spam GROUP BY provider ORDER BY random() LIMIT 10;
Here's one that works:
SELECT
(SELECT deal FROM spam WHERE spam.provider = sel_prov.provider ORDER BY random() LIMIT 1),
sel_prov.provider
FROM (select provider FROM spam GROUP BY provider ORDER BY random() LIMIT 10) sel_prov;
... pretty much just by implementing the phrasing above as SQL. Don't know if it's fast; you get the idea.
If the above rephrasing isn't correct, please clarify your question with sample data and an example, or some more detail in your description.