2010-10-12 11 views
20

Ci sono dei generatori di numeri pseudo casuali che sono abbastanza facili da fare con l'aritmetica mentale o l'aritmetica mentale più il conteggio delle dita. Ovviamente questo limita la matematica abbastanza semplice - deve essere qualcosa che può fare qualcuno che ha un'abilità matematica media, o forse una capacità media per un programmatore, non un matematico prodigio.Esiste un generatore di numeri pseudo casuali abbastanza semplice da fare nella tua testa?

Il più semplice che ho trovato è il Middle square method, ma non solo è noto per essere una scarsa fonte di casualità, sembra ancora troppo complesso per fare a meno di carta e matita.

Se l'unico modo per farlo è limitando l'intervallo, come forse può solo produrre 8 numeri di bit, va bene. Sospetto che uno degli algoritmi PRNG standard sarebbe abbastanza semplice in una versione a 8 bit, ma non ne so abbastanza per semplificare nessuno di essi dalla versione a 32 bit a una versione a 8 bit. (Tutti quelli che ho guardato dipendono da numeri di seme appositamente selezionati che variano a seconda di quanti bit stai lavorando, e di solito solo esempi a 32 e 64 bit.)

+14

Passo 1. Pensa al primo numero che ti viene in mente. ;-) –

+4

@Mike Deck: L'ho fatto, e ho ottenuto 6275182149295802584461. Ho bisogno di dormire un po '. – BoltClock

+4

Pensare al primo numero che ti viene in mente ha una scarsa funzione di distribuzione. Ad esempio, 7 e 17 sono molto più comuni di altri numeri. http://scienceblogs.com/cognitivedaily/2007/02/is_17_the_most_random_number.php – LeBleu

risposta

14

A linear feedback shift register A è abbastanza semplice, a patto che tu sia a tuo agio nel pensare in binario (o forse in esadecimale, poiché è facile mappare tra i due).

Uno più complesso è Xorshift, ma se si conoscono le operazioni bit a bit, dovrebbe essere anche possibile lavorare con altrettanto.

2

Nella tua testa puoi fare "semantica" generazione di numeri casuali :-)

Come prendere una parola a caso e calcolando qualche metrica su di essa, ripetere fino a ottenere il numero con una lunghezza ragionevole.

Ad esempio, la parola "esercizio" potrebbe essere convertita in 10100101b (puoi vedere la mia idea di conversione qui).

35

pseudo-casuale (according to Dilbert):

Dilbert Cartoon of 2001-10-25

+3

Quindi stai dicendo "pensa a 9"? –

+4

No, qualunque cosa tu faccia, non pensare a 9. – Hans

+2

Ho preso in considerazione il collegamento preventivo di quello e il fumetto di xkcd nella mia domanda .... suppongo che dovrei avere – LeBleu

3

Come su Blum Blum Shub, ma con numeri primi troppo piccole per l'uso sicuro? Usato in modo sicuro è lento, ma implica operazioni con cui siamo abituati, quindi potresti essere in grado di raggiungere una velocità gestibile senza troppa pratica, forse con M = 437 o moderatamente più grande.

Dubito che tutto ciò che potrei fare nella mia testa sarà sicuro, comunque. Non riesco a ricordare numeri abbastanza grandi per lavorare senza errori in uno stato di dimensioni ragionevoli.

si può facilmente fare un 10 bit LFSR sulle dita, se si dispone di tendini decenti ;-)

Non è una risposta diretta, ma a seconda perché stai chiedendo potreste essere interessati a Solitaire, che genera un keystream (cioè una sequenza pseudo-casuale) usando un mazzo di carte. Non può essere fatto nella tua testa, ma non richiede carta e matita.

+0

Non credo che Blum Blum Shub sia abbastanza casuale con piccoli divisori ... M = 437 dà un periodo di 31 o meno. Anche i primi numeri sono sempre quadrati del seme, a meno che non si usi un seme grande. – LeBleu

+0

@LeBleu: abbastanza giusto - ovviamente non so quanti numeri hai bisogno. Come ho detto, non penso di essere abbastanza bravo nell'aritmetica mentale per valutare un buon PRNG, quindi è necessario essere entrambi migliori di me, o decidere quanto male un RNG sei disposto ad accettare ;-) –

0

Sì, so di uno che può essere fatto nella tua testa, e se modificato ulteriormente può portare a numeri veramente casuali prendere una lista di numeri, un elenco ordinato di numeri in base dieci che sarebbe il più facile da calcolare in.Aggiungili insieme, mantieni solo i numeri in cifre del numero risultante e poi posizionali alla fine dell'elenco e rilascia la prima cifra, e poi ripeti, questo non produrrà veri numeri casuali ma abbastanza casuali e dipendenti sulla dimensione della lista di numeri che si sceglie di utilizzare, alla fine si ripeterà ma per un elenco iniziale di grandi dimensioni non si ripeterà per un tempo sufficientemente grande.

per esempio se ho usato solo 5 numeri in una lista 12345 quindi la prossima lista sarebbe 2345 e la cifra più a destra di 1 + 2 + 3 + 4 + 5ie 15 o 5 quindi la lista sarebbe 23455 ora quella che ha lasciato cadere e non è più usato così la somma successiva aggiunge fino a 20 -1 (15 + 5 meno quello che è caduto) quindi la prossima lista sarebbe 34559 quindi 45596 poi 55969 poi 59694 ora qui ci fermiamo, perché abbiamo generato un valore completo di cifre quindi inizialmente avevamo 12345.

Per il prossimo seme abbiamo 59694, ora c'è una sorta di scorciatoia che è possibile utilizzare anche una volta che è stato calcolato un seme completo, o la scorciatoia stessa potrebbe essere utilizzato, che si prende l'ultima cifra, moltiplicare per 2 e sottrarre la prima cifra raddoppiando una cifra è facilmente fatto nella testa, l'importante la cosa è ricordare tutte le altre cifre e il loro ordine nella sequenza, questo nella migliore delle ipotesi produce solo numeri pseudo - casuali, con alcuni lunghi tempi di ripetizione più grande è la lista di numeri che si usano, ma la lista iniziale deve essere scelta con cura, come ad esempio non selezionare tutti gli zeri come si lista o si avrà un flusso infinito di zeri e bene alcuni gruppi di cifre produrranno cicli di ripetizione più lunghi rispetto ad altri (ma forse questo dovrebbe essere fatto su carta purché si abbia una matita o penna e un foglio di carta a portata di mano ... :) spero che questo aiuti .. (modificato un po 'questo fa l'inizio di un ottimo generatore di numeri casuali vero) goditi ...

Spero che sia meglio se non allora dimmi così :) (non sono mai stato molto bravo in inglese! :)

+2

si prega di dare un'occhiata alla [guida alla formattazione] (http://stackoverflow.com/editing-help). Questo è solo un grande muro di testo :) – oers

+0

oh l'aiuto per la formattazione non l'ho visto, dov'è ?? mi dispiace per quel muro di testo, non importa come sia formattato ciò che conta è l'informazione all'interno .. Immagino di essere così preoccupato degli errori di ortografia che ho dimenticato di formattare in modo più leggibile, mi dispiace. –

+0

È il Yellow-Box con il? dentro. Sopra il campo della risposta. Ma per favore formatta il tuo testo. È molto difficile da leggere e questo rende quasi impossibile comprendere le informazioni al suo interno. In che modo una risposta sembra influenzare molto la sua accettazione da parte della comunità. – oers

-2

Il modo più semplice sarebbe quello di generare diversi numeri che ti vengono in mente e quindi sommare e modare 10 cifre ciascuna. Più numeri aggiungi, più sarà casuale e meno distorto.

510932 
689275 
539108 
====== 
628205 
+0

Bel punto, comunque è distorto perché sta per generare una funzione monotona, come A + B> = A. – Lourenco

2

Questo è piuttosto semplice e dovrebbe inserirsi nella maggior parte dei testa delle persone:

  1. iniziare con un numero di semi di tre cifre (trovare un seme adeguato può essere un problema più difficile).
  2. Moltiplica per nove.
  3. Separare la quarta cifra dal terzo inferiore e aggiungere i due numeri insieme per un nuovo numero a tre cifre.
  4. Annotare queste cifre. Per aiutare a mascherare il modello potresti scrivere solo una o due cifre.
  5. Ripetere 2-4 secondo necessità.

Fintanto che non si inizia con zero, questo itererà attraverso un periodo di 4500 risultati. L'output non "sembra" casuale, ma è in decimale e anche i veri risultati casuali non sembrano casuali, motivo per cui gli umani succhiano questo compito.

Potrei provare ad hackerare un programma per convertirlo in binario in modo imparziale per testarlo.

Configurazioni alternative:

  • tre cifre e moltiplicare per 3
  • quattro cifre e moltiplicare per 6
  • cinque cifre e moltiplicare per 2
-1

Se sono consentiti algoritmi non deterministici, i tuoi occhi sono nella tua testa, quindi per quanto riguarda qualcosa come "il numero di oggetti rossi di fronte a me più il numero di cose blu modulo il numero di cose verdi più l'altezza del pila più alta di cose contenente almeno una cosa con le lettere g e maiuscole A su di essa. "

Sono sicuro che c'è un modo per farlo che in realtà sarebbe abbastanza casuale.

+0

Non ho problemi con algoritmi non deterministici, ma sfortunatamente ci sono anche molti modi per farlo che sarebbe abbastanza prevedibile, come come altamente dipendente dalle frequenze lettera nella tua lingua madre. L'esempio specifico che hai dato avrebbe anche dato un solo numero casuale per una determinata vista, e se due persone l'una accanto l'altra lo usassero probabilmente otterrebbero lo stesso numero. – LeBleu

+0

Non ci ho pensato. Forse aggiungi il tuo nome e la tua età? L'unico problema di vista numero è ancora piuttosto importante. – EternityForest

Problemi correlati