- Messaggi
- 25,993
- Reazioni
- 13,039
- Punteggio
- 254
non è sbagliato il ragionamento ma il presupposto:bastano solo 6 scambi per ottenere una sestina perfettamente casuale.
Se poi ritieni comunque che quello che dico sia sbagliato, allora spiegami e dimostrami il perché
il randomizzatore integrato in C (ma non solo quello del C) non genera numeri sufficientemnete casuali o, in altri termini, non genera sequenze casuali di probabilità uniforme. Le implementazioni dei rand(), sono poco sofisticate per questioni di efficienza, ed generano se quenze "troppo poco" casuali, anche se ad occhio non si vede.
Per un esercizio "scolastico" il metodo proposto va bene, ma ci dobbiamo chiedere se si possa far meglio. Aumentare di molto il numero di scambi (come avevo proposto) sposta solo un po' più in là i termini della questione.
Devo aprire un off-topic
A meno di non ricorrere a librerie specializzatte esterne, con il solo randomizzatore incorporato, per mitigare il problema della "pseudocasualità troppo poco casuale" è cercare di introdurre elementi che possano amentare l'incertezza del risultato (il prossimo numero della sequenza), per esempio:
- dare un seme (un numero) con l'istruzione srand(time(0));o simili --> imposta un seme abbastanza casuale e non prevedibile (perché basato sul conteggio di secondi trascorsi da una certa data) che sarà usato dal randomizzatore per generare le sequenze. Le sequenze saranno indici dell'array (da dividere modulo 90 per essere certi di ricadere nel range giusto)
- una seconda domanda potrebbe essere "quanti scambi faccio? (min X -max Y)", contando sul fatto che (si spera) il numero che viene in mente all'utente sia diverso di volta in volta (il che può non essere vero ed in tal caso ci si affida al solo seme del punto precedente), o altrimenti si genera un nuovo intero casuale compreso in un certo range per "casualizzare" anche il numero di scambi. A occhio il minimo per me è 45, per dare una chance di scambiare almeno una volta ciascun elemento (anche se questo non toglie che lo stesso numero potrebbe essere scambiato più volte ed altri invece mai)
- con il seme introdotto al primo punto si può essere ragionevolmente certi che le sequenze di indici da scambiare saranno diverse ogni volta che si lancia il programma. Con il secondo punto si dovrebbe "mischiare" meglio l'array