Come ponderare dinamicamente un generatore casuale per guidare un set di risultati verso una distribuzione desiderata? [chiuso]

1

Dire che ho una funzione che restituisce una selezione ponderata da un insieme di risorse, in base a una distribuzione desiderata. Per ragioni di argomenti, lascia che quella risorsa sia una stringa di colori.

const distribution = {
  red: .1666,    // We want 1/6th of colors in the world to be 'red'  
  yellow: .3333, // ... 1/3 to be 'yellow'
  blue: .5       // ... and 1/2 to be 'blue'
}

// returns ~1/6 'red', ~1/3 'yellow', ~1/2 'blue'
function getWeightedColor() {...}

Se volessi pesare ulteriormente il valore di ritorno basato su dati esistenti allo scopo di indirizzare i dati verso la distribuzione desiderata più rapidamente, come potrei conseguirlo?

// Accepts a counts dict in the format '{<color>: count, ...}' and based on
// the distribution of that dict, further weights the selection such that
// the return value adjusts the dict toward the desired distribution.
function getWeightedColor(colorCounts) {...}

// Examples:

getWeightedColor({red: 100, yellow: 200, blue: 300}); 
// given distribution already normal, so we'd use the unadjusted weights

getWeightedColor({red: 100, yellow: 250, blue: 10});
// given distribution has far too few blues and somewhat too many yellows, 
// so the weights would be adjusted to compensate. The odds of 'blue'
// would be greatly increased, red somewhat decreased and yellow moreso.
    
posta numbers1311407 24.01.2018 - 03:12
fonte

2 risposte

2

If I wanted to further weight the return value based on existing data with the purpose of guiding the data toward the desired distribution more quickly, how would I achieve that?

Questo è il punto cruciale della domanda e cosa lo rende diverso dai duplicati proposti. Vuoi una distribuzione ponderata, ma una che si inclina verso il rapporto desiderato mentre l'algoritmo è in esecuzione .

Il modo più semplice per farlo è trattarlo come un mazzo di carte in cui ogni carta è un risultato possibile nel tuo algoritmo (ad esempio colore, nel tuo esempio). L'algoritmo si presenta così:

  1. Costruisci un mazzo di carte N dove N è il minimo comune multiplo del denominatore in ciascuna delle probabilità. Nel tuo esempio, LCM (2,3,6) = 6.
  2. Aggiungi le carte per ogni possibilità in modo che il rapporto complessivo sia corretto. Nel tuo esempio, dovresti aggiungere un rosso, due giallo e tre blu. 1/6 rosso, 2/6 = 1/3 giallo e 3/6 = 1/2 blu.
  3. Mescola il mazzo.
  4. Ogni volta che viene richiesto un colore, estrai la carta successiva dalla parte superiore del mazzo.
  5. Se il passaggio precedente non riesce perché non ci sono più carte, torna al passaggio 1 e passa al passaggio precedente.

Questo differisce da un algoritmo tipico per selezionare i valori ponderati perché ogni estrazione dipende da quella precedente. Considera un gioco di Monopolio . Ogni volta che un giocatore tira il dado, può verificarsi una delle undici possibilità (2-12) con diverse probabilità e questo è vero non importa quando il giocatore tira. Confronta con l'atterraggio su Chance o Community Chest. Le probabilità di pescare una carta specifica variano nel corso del gioco quando i mazzi sono esauriti e alla fine rimescolati. Se c'è una sola carta rimasta da pescare, e il giocatore sta tenendo traccia (o guarda nella pila degli scarti), è possibile sapere esattamente qual è la carta prima di disegnarla. Il primo esempio è un evento indipendente , il secondo esempio è un evento dipendente perché la carta di disegno N si basa su tutti i disegni da 1 a N-1. L'ordine è casuale, ma le probabilità complessive sono precisamente 1/6, 1/3 e 1/2 dato un multiplo di sei pareggi.

    
risposta data 24.01.2018 - 21:04
fonte
1

Se continui a eseguire la funzione abbastanza a lungo, converrà naturalmente ai pesi specificati.

Ma non è abbastanza veloce.

Quello che vuoi sono i pesi dinamici. Il problema è che non esiste un modo giusto per farlo e che determinerebbe in modo determinante che il tuo algoritmo "meno casuale" diventi prevedibile.

Ad esempio la tua distribuzione potrebbe diventare:

red
1/6 + 1/6*(1/6 - redamound/totalamount)
yellow
1/3 + 1/3*(1/3 - yellowamount/totalamount)
blue:
1/2 + 1/2*(1/2 - blueamount/totalamount)

Questo spingerà la tua distribuzione verso la tua distribuzione desiderata più velocemente se si allontana ulteriormente da essa.

    
risposta data 24.01.2018 - 15:56
fonte

Leggi altre domande sui tag