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?