Devi provare di più: nel senso, sono necessari più tentativi per aumentare le possibilità di ottenere 10 cifre.
Per quanto riguarda il programma, notevolmente trarrà vantaggio dal miglioramento della registrazione. Il modo in cui è fatto ora, l'output del programma manca semplicemente di un'informazione che aiuterebbe a identificare ciò che sta accadendo lì.
Se aggiungi poche righe al metodo main
per contare il numero di array trovati e riesegui il programma con una registrazione migliorata, probabilmente otterrai una sensazione molto migliore di dove tutto sta arrivando come valore% aumenti diNUMBER_OF_DIGITS_TO_ORDER
. Considera la registrazione come segue:
public static void main(String[] args1) {
loadNaturalOrderedArray();
// let's count our attempts
long numberOfChecks = 0;
// let's count our luck
long numberOfNaturalOrdered = 0;
for (int i = 0; i < TRIALS; i++) {
ArrayList<char[]> listOfArrays = new ArrayList<char[]>(NUMBER_OF_CHAR_ARRAYS);
for (int j = 0; j < NUMBER_OF_CHAR_ARRAYS; j++) {
listOfArrays.add(j, generateRandomDigits());
}
for (int j = 0; j < NUMBER_OF_CHAR_ARRAYS; j++) {
numberOfChecks++; // count our attempts
char[] current = listOfArrays.get(j);
if (isNaturalOrdered(current)) {
numberOfNaturalOrdered++; // count our luck
//printNaturalOrdered(current); // not important
}
}
System.out.println("trial " + i + " is done");
System.out.println("--------------------------------\n");
}
// print our luck
System.out.println("number of natural ordered: [" + numberOfNaturalOrdered + "]");
// print our attempts
System.out.println("number of checks: [" + numberOfChecks + "]");
// btw numberOfChecks is always TRIALS * NUMBER_OF_CHAR_ARRAYS
System.out.println("DONE");
}
Iniziamo con il caso "piccolo" per vedere come vanno le cose. Guarda, il programma rilascia cifre casuali (univoche), diciamo da 0 a 2 su 3628800 matrici ( NUMBER_OF_CHAR_ARRAYS
) - facendo sostanzialmente 3628800 tentativi e controllando quante volte ottiene 0,1,2
. Siamo sicuri di averlo preso molto.
- Il fatto è che ci sono solo% combinazioni possibili di% co_de che potrebbero entrare nel nostro array generato casualmente - il primo posto può essere occupato da una delle tre cifre, il secondo posto può essere occupato da una delle due cifre rimanenti; per quanto riguarda il terzo posto, non abbiamo nessuna opzione finché il primo e il secondo posto sono occupati. Detto questo, possiamo per ottenere circa
3*2=6
.
Ok, ora facciamo lo stesso con le cifre da 0 a 6. Il numero di tentativi rimane lo stesso, 3628800, ma l'array che vogliamo è sempre più difficile da generare casualmente perché è più lungo: 3628800/6=600000
. Per array di questa lunghezza, esistono% combinazioni possibili di% co_de - e le nostre probabilità di ottenerlo con lo stesso 3628800 sono 0,1,2,3,4,5,6
, più di cento volte inferiori rispetto a% con array 6*5*4*3*2
. E peggiorerà solo con l'aumento della lunghezza dell'array.
Infine, proviamo "vincere una lotteria", per ottenere 6*5*4=120
- tutte e dieci le cifre perfettamente allineate - con lo stesso numero di tentativi che ci hanno portato tanta fortuna con 3 cifre, sensibilmente meno fortuna con 6 cifre e fortuna piuttosto traballante con 9 cifre? "Abbastanza traballante": durante le prove, ricevevo nove cifre da 2 a 5 volte; ottenere ancora un'altra cifra "nella linea" è probabilmente 10 volte più difficile di quella.
- Ci sono cinque combinazioni
0,1,2
possibili con 10 cifre univoche - questo rende le nostre probabilità 0,1,2,3,4,5,6,7,8,9
, circa cinquemila volte peggio di quello che abbiamo per il nostro numero di tentativi per un set ordinato di 6 cifre.
Aspettarsi 10 cifre ordinate da mostrare è come comprare centinaia di biglietti della lotteria e chiedersi
perché non ho vinto il jackpot?