Come dice correttamente la risposta accettata, sarebbe un orribile PRNG. Vuoi che il periodo del generatore sia di molti ordini di grandezza maggiore del numero di valori che genera; la tua proposta è che siano uguali.
Ma la tua domanda non era "critica questa idea", ma piuttosto
does a practical, usable pseudo-random number generating algorithms exist that never repeat the same number twice until their period is up.
Certo, è facile. Eccone uno:
- Scegli il periodo che desideri. Chiamalo
p .
- Chiaramente il numero di valori generati dal PRNG non deve essere inferiore a
p , perché altrimenti, secondo il principio del pigeonhole, si ripete un'uscita in meno di p passi. Supponiamo che il numero di possibili valori generati dal PRNG sia anche p , e che generi numeri da 0 a p-1 .
- Ora il nostro algoritmo è semplice. Abbiamo due semi, che chiamiamo
s e i , entrambi tra 0 e p-1 . s può essere qualsiasi cosa. i deve essere qualsiasi numero coprime a p . L'ennesimo elemento generato dal PRNG con i semi s e i è (n * i + s) % p . Ovvero, moltiplica i per n , aggiungi s e prendi il resto quando quel valore è diviso per p .
- Questo ti dà una sequenza di numeri pseudo-casuali incredibilmente crappy che si ripetono con
p periodo e non generano mai lo stesso numero nel periodo, e ogni numero è compreso tra 0 e p-1 . Godetevi.
- Facciamo un esempio.
p=10 , i=3 , s=5 , la sequenza è 5, 8, 1, 4, 7, 0, 3, 6, 9, 2 e poi si ripete.
- Si noti che il bit basso della sequenza prodotta da questo algoritmo alterna ogni fase successiva; è davvero pessimo!
- Hai chiesto se esiste un algoritmo, non esiste alcun algoritmo buono .
Questo è stato davvero schifoso. Possiamo fare di meglio?
Fondamentalmente quello che stai chiedendo è "Ho bisogno di una permutazione casuale di questo set". Ci sono molti buoni algoritmi per questo. Poiché esistono% permutazioni di% co_de di un insieme con% elementi esclusivi dip!, ciò che devi fare è scegliere un numero uniforme tra 0 e p , e quindi generare una permutazione da quel numero.
Generare il seme casuale è il tuo problema; Descrivo come trasformarlo in una permutazione nella mia lunga serie su proprietà interessanti di permutazioni, che puoi leggere qui:
link