Originariamente inviato da blascobz
codice:
30  5
31  5
32  5
33  5
34  5
35  5
36  5
37  5
38  5
39  5
40  5 
    ___
     55 utenti
Se non mi sfuggono dei vincoli del tuo contesto che non mi hai enunciato, l'unico modo in cui puoi ottenenere una distribuzione del genere senza "sprecare" chiamate è il seguente:

Chiamiamo classi i gruppi di utenti che devono generare lo stesso numero di chiamate.
C= Numero totale chiamate settimanali da erogare (1925 nel tuo esempio)
U= Il numero totale di utenti coinvolti (55 nel tuo esempio)
Min = Minimo chiamate per utente (30 nel tuo esempio)
Max = Massimo chiamate per utente (40 nel tuo esempio)

Allora vale
Num Classi = Max - Min +1 (11 nel tuo esempio)
Dim Classe = U / Num Classi (5 nel tuo esempio)
Max Chiamate Classe = Un numero crescente da Min a Max (le assegni in un cliclo da 0 a Num Classi) moltiplicato per Dim Classe
Max Chiamate Utente = Un numero crescente da Min a Max (le assegni in un cliclo da 0 a Num Classi)

Inizialmente contrassegni ogni classe con un ordinale da 0 a Num classi e ogni utente nella classe con un ordinale da 0 Dim Classe
(bastano gli indici degli array o delle arraylist)

Le probabilità direi che non ti servono, quello che ti serve è un contatore di chiamate per classe e un contatore di chiamate per utente.

-Per ogni chiamata, che se ho capito bene è simulata da un numero random compreso tra zero e 1, rimappi il numero random su un numero da 0 a Num Classi
in modo da sceglierne una
- Incrementi il contatore di quella classe
-Se la classe è arrivata al massimo di chiamate la elimini dalla lista (e quindi Num Classi su cui rimappare il random decresce di uno)
- Rimappi il numero random su un intervallo da 0 a Dim classe in modo da scegliere un utente della classe
-Incrementi il contatore dell'utente e se è arrivato a Max Chiamate utente lo elimini dalla classe (Quindi Dim classe diminuisce di uno per quella classe)
A mio avviso questo ti consente di ottenere sempre la distribuzione che cerchi se non mi è sfuggito nulla nel ragionamento.