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: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
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.