A caso e iterando in modo univoco su un intervallo

2

Supponiamo di avere un intervallo di valori (o qualsiasi altra cosa) e di voler eseguire un'iterazione nell'intervallo e fermarsi in qualche punto indeterminato.

Poiché il valore di arresto potrebbe essere in qualsiasi punto dell'intervallo, l'iterazione sequenziale non va bene perché causa l'accesso ai valori iniziali più spesso rispetto ai valori successivi (il che è dannoso per le cose che si consumano) e anche perché riduce le prestazioni poiché deve attraversare valori extra.

L'iterazione casuale è migliore perché aumenterà (in media) il tasso di successo in modo che sia necessario accedere a un numero minore di valori prima di trovare quello giusto e anche distribuire gli accessi in modo più uniforme (ancora, in media).

Il problema è che il metodo standard di saltare casualmente fa sì che i valori vengano consultati più volte e non ha un modo automatico per determinare quando ogni valore è stato controllato e quindi l'intero intervallo è stato esaurito.

Una soluzione semplificata e inventiva potrebbe essere quella di creare un elenco di ciascun valore, sceglierne uno a caso, quindi rimuoverlo. Ogni volta attraverso il ciclo, ne scegli uno dall'insieme di oggetti rimanenti. Sfortunatamente questo funziona solo per le piccole liste. Come esempio (forzato), dì che stai creando un gioco in cui il programma cerca di indovinare quale numero hai scelto e mostra quanti indovinelli ci sono voluti. L'intervallo è compreso tra 0-255 e invece di chiedere È 0? È 1? È 2? ... , lo indovini casualmente. È possibile creare un elenco di 255 numeri, selezionarli casualmente e rimuoverli. Ma cosa succede se l'intervallo era tra 0-2 32 ? Non puoi davvero creare un elenco di articoli da 4 miliardi.

Ho visto un paio di RNG di implementazioni che dovrebbero fornire una distribuzione uniforme, ma nessuna di queste avrebbe dovuto anche essere unica, cioè senza valori ripetuti.

Quindi esiste un modo pratico per eseguire casualmente e iterare in modo univoco su un intervallo?

    
posta Synetech 07.11.2013 - 23:03
fonte

1 risposta

6

generatore congruenziale lineare (il x'=(a*x+c) mod m uno) con alcuni semi casuali

se hai m uguale alla dimensione dell'array non otterrai un valore di ripetizione fino a quando non ne fai scorrere tutti

la qualità della loro casualità non è la migliore, ma se vuoi solo bilanciare il carico va bene

modifica: una cosa da tenere a mente è che le ripetizioni non sono probabili sulla distribuzione uniforme con un buon RNG e un ampio intervallo da cui generare, quindi solo escludendo le ultime poche è un'opzione

così puoi tenere gli ultimi N numeri che hai preso ed escluderli dal pool disponibile (basta generare un altro numero quando è una ripetizione),

    
risposta data 07.11.2013 - 23:12
fonte

Leggi altre domande sui tag