Sto cercando come Python implementa i dizionari. Una delle equazioni nell'attuazione dizionario pitone riguarda la pseudo casuale rivelamento per uno slot dizionario vuoto usando l'equazioneIn Python Dizionari, come fa ((j * 5) +1)% 2 ** I cicla tutto 2 ** i
j = ((j*5) + 1) % 2**i
che si spiega here.
Ho letto questa domanda, How are Python's Built In Dictionaries Implemented e fondamentalmente capisco come vengono implementati i dizionari.
Quello che non capisco è perché/come l'equazione:
j = ((j*5) + 1) % 2**i
cicli attraverso tutti i resti di 2**i
. Ad esempio, se i = 3
per un totale di partenza 8. j
passa attraverso il ciclo:
0
1
6
7
4
5
2
3
0
se la dimensione di partenza è di 16, sarebbe passare attraverso il ciclo:
0 1 6 15 12 13 2 11 8 9 14 7 4 5 10 3 0
Questo è molto utile per sondare tutti gli slot nel dizionario. Ma perché funziona? Perché lo standard j = ((j*5)+1)
funziona ma non è j = ((j*6)+1)
o j = ((j*3)+1)
che rimangono bloccati in cicli più piccoli.
Spero di ottenere una comprensione più intuitiva di questo rispetto l'equazione funziona ed è per questo hanno usato.
Poiché 5 è co-primario con 2^i, quindi [LCM] (https://en.wikipedia.org/wiki/Least_common_multiple) è 5 * 2^i. –
Alcune righe sopra la tua citazione: "vedi qualsiasi testo sulla generazione di numeri casuali per prova" :) – Jasper
@OliverCharlesworth da quell'argomento, quindi (j * 3) +1 dovrebbe funzionare. – kevmo314