Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [Java] distribuzione uniforme random con assegnazione probabilità

    Ciao a tutti,
    Ho un problema di programmazione apparentemente non difficile ma che mi sta facendo diventare un pò scemo..cerco di spiegarmi al meglio:

    Ho un generatore di tracce audio implementato in java che lavora al rate costante di 1 chiamata al secondo per un tempo pari a una settimana di osservazione, il che significa che genera circa 604800 chiamate totali.
    Inoltre ho 10000 chiamanti, questi dovrebbero seguire una distribuzione uniforme (min, max) nell'effettuare le chiamate, ovvero io setto un valore minimo e massimo (per esempio minimo 30 chiamate a settimana e massimo 90) e i 10000 chiamanti devono essere distribuiti uniformemente tra 30 e 90 chiamate a settimana.

    Il simulatore assegna delle probabilità ai chiamanti, dopodichè genera in modo random un double tra 0 e 1 e va a scegliere il chiamante che ha la probabilità uguale o piu vicina possibile al valore random generato.

    La mia domanda è la seguente: come posso assegnare le probabilità ai chiamanti modificando il sorgente del generatore in modo tale da assicurare che i chiamanti siano distribuiti uniformemente tra il valore minimo e massimo di chiamate a settimana?

    Per esempio: con 604800 chiamate totali e 10000 utenti io dovrei ottenere circa 166 utenti che generano 30 chiamate l'uno a settimana, 166 che ne generano 31...ecc ecc ecc 166 utenti che generano 90 chiamate a settimana.

    Spero di essermi spiegato decentemente,
    Grazie, Maurizio.

  2. #2
    Posta un po di codice pliiis. Ancora meglio sarebbe che tu mettessi su un banalissimo esempio (che compila) che simula il tuo scenario e lo postassi.
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  3. #3
    purtroppo il codice è parecchio lungo (questo è una piccola parte di un progetto più grande) e l'assegnazione delle probabilità viene eseguita da una classe, la generazione di chiamate da un'altra e cosi via quindi postare il codice mi risulta alquanto complicato, ma in generale i passi sono questi:

    1) generazione 10000 chiamanti.
    2) assegnazione valori da 0 a 1 tra i chiamanti, (col metodo attuale che però è sbagliato ed è proprio quello che vorrei cambiare) quindi user1 avrà probabilità circa 0.00005 e user10000 avrà probabilità 1.0000
    3) scelta random double tra 0 e 1. il valore random corrisponde ad un utente tra i 10000.
    4) generazione chiamata (una semplice stringa) assegnata all'utente scelto sopra.

    il mio è un discorso forse + teorico che pratico, ma vorrei trovare un modo per far rispettare ai miei 10000 chiamanti i limiti imposti e che fossero distribuiti uniformemente tra questi limiti.

  4. #4
    Originariamente inviato da blascobz
    2) assegnazione valori da 0 a 1 tra i chiamanti, (col metodo attuale che però è sbagliato ed è proprio quello che vorrei cambiare) quindi user1 avrà probabilità circa 0.00005 e user10000 avrà probabilità 1.0000
    Ma quale dovrebbe essere la distribuzione corretta delle probabilità allora? Fammi almeno un esempio completo con 10 utenti, le probabilità volute per ciascuno di essi, 100 chiamate in tutto eccetera...Insomma un esempio reale (con numero piccoli) che mi faccia capire quale è la situazione attuale e quale è l'obiettivo...sarò un po tardo io ma non sono riuscito ancora ad afferrare.
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  5. #5
    Originariamente inviato da blascobz
    purtroppo il codice è parecchio lungo (questo è una piccola parte di un progetto più grande) e l'assegnazione delle probabilità viene eseguita da una classe, la generazione di chiamate da un'altra e cosi via quindi postare il codice mi risulta alquanto complicato, ma in generale i passi sono questi:

    1) generazione 10000 chiamanti.
    2) assegnazione valori da 0 a 1 tra i chiamanti, (col metodo attuale che però è sbagliato ed è proprio quello che vorrei cambiare) quindi user1 avrà probabilità circa 0.00005 e user10000 avrà probabilità 1.0000
    3) scelta random double tra 0 e 1. il valore random corrisponde ad un utente tra i 10000.
    4) generazione chiamata (una semplice stringa) assegnata all'utente scelto sopra.

    il mio è un discorso forse + teorico che pratico, ma vorrei trovare un modo per far rispettare ai miei 10000 chiamanti i limiti imposti e che fossero distribuiti uniformemente tra questi limiti.
    Ma non riesci ad implementare il punto 2 oppure nessuno?

  6. #6
    Cerco di spiegarmi meglio in effetti sono stato un pò confuso. Il problema è questo (prendendo in considerazione un esempio piu piccolo):
    Se io setto un MIN e un MAX come limite del numero di chiamate effettuate da ogni singolo chiamante vorrei ottenere una distribuzione simile a questa: (supponendo che MIN=30 e MAX=40 e abbia un numero di utenti pari a 55)

    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
    con un totale di 1925 chiamate (= 30x5+31x5+32x5+...+40x5). Quindi alcuni utenti devono generare + chiamate rispetto ad altri (5 utenti devono generare 40 chiamate mentre altri 5 devono generarne solo 30). Quindi come posso implementare questo "sistema"? (ovviamente non deve esser perfetto ma devo ottenere una distribuzione simile a quella teorica appena riportata).

    Fino ad oggi si è cercato di dare agli utenti differenti probabilità di esser certi..in modo tale che qualcuno avesse una probabilità + alta (in modo da generare + chiamate vicino a MAX) e ad altri + bassa (in modo da generare un nr di chiamate vicino a MIN) ma ahimè è stato male implementato in quanto si ottengono risultati inaccettabili tipo (riferito all'esempio sopra)

    codice:
    16  1
    25  1
    26  4
    27  2
    28  1
    29  5
    30  3
    31  4
    32  1
    33  4
    34  5
    36  2
    37  5
    39  1
    40  1
    41  2
    42  3
    43  1
    44  2
    45  3
    46  1
    48  1
    50  1
    51  1
        ___
         55 utenti
    quindi un utente ha generato 16 chiamate, 1 utente ne ha generate 25, 4 utenti hanno generato 26 chiamate ecc ecc..Ho bisogno di raffinare l'implementazione in modo da ottenere un risultato + simile a quello teorico riportato nel primo esempio.

    Grazie,

    Maurizio.

  7. #7
    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.
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  8. #8
    Ammetto che la mia soluzione non soddisfa appieno i tuoi requisiti, cioè non fa uso di un valore di probabilità per selezionare il chiamante. Il motivo di ciò è molto semplice: secondo me non è possibile ottenere la distribuzione che hai esemplificato lasciando quel requisito. L'ho postata lo stesso perché non so se per te quello è un vincolo di progetto (e in quel caso la mia soluzione non ti può essere utile) o semplicemente la tua maniera per implementare un sistema che genera distribuzioni del genere (e in quel caso la mia soluzione dovrebbe fare al caso tuo). Ciao
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  9. #9
    Grazie per la risposta!

    Purtroppo ho il vincolo della probabilità e questo fa si che sia tutto un pò + "complesso" ma inizio ad avere diversi dubbi sulla fattibilità della cosa mantenendo le probabilità, o per lo meno non riesco a trovare una "giusta" distribuzione delle probabilità..per fortuna domani mattina ho un meeting, vediamo gli sviluppi e vi faccio sapere

    Grazie,

    Maurizio.

  10. #10
    Originariamente inviato da blascobz
    Grazie per la risposta!

    Purtroppo ho il vincolo della probabilità e questo fa si che sia tutto un pò + "complesso" ma inizio ad avere diversi dubbi sulla fattibilità della cosa mantenendo le probabilità, o per lo meno non riesco a trovare una "giusta" distribuzione delle probabilità..per fortuna domani mattina ho un meeting, vediamo gli sviluppi e vi faccio sapere

    Grazie,

    Maurizio.
    A mio parere non è proprio fattibile forzare quella distribuzione lavorando su delle "probabilità", discende dal fatto stesso che una probabilità non è una certezza . Fai sapere gli sviluppi comunque, il tuo è uno dei pochi problemi stimolanti che ho beccato di recente qui sul forum e mi interessa sapere come va
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.