Numero Casuale

di il
19 risposte

19 Risposte - Pagina 2

  • Re: Numero Casuale

    A questo punto se non si parla più di numeri casuali, sarebbe opportuno aprire un thread sulle "permutazioni" e lasciare questo aperto per il numero casuale.
    Quello che state proponendo sono algoritmi che in genere si usano anche per creare tutte le parole combinate con le stesse lettere di una parola, per esempio a modo di anagrammazione, potete trattare i numeri come lettere, oppure come scansione di numeri per intercettare una combinazione.
    L'intenzione è quello di creare uno scanner per individuare una combinazione facendo ruotare tutti i numeri possibili?

    Per le permutazioni e i calcoli combinatori può esservi utile questo:
    http://www.matematika.it/public/allegati/39/15_04_Calcolo_combinatorio_1_0.pdf
  • Re: Numero Casuale

    Mmmm... Questa è davvero una buona idea . Appena ho un po' di tempo provo a buttar giù qualche riga ^-^
    E grazie @Cursore per il link, ora vado a dare un'occhiata e se riscontro problemi apro un'altra discussione
  • Re: Numero Casuale

    Cursore ha scritto:


    A questo punto se non si parla più di numeri casuali, sarebbe opportuno aprire un thread sulle "permutazioni"...
    Per la precisione quello che serve in questo caso sono le "disposizioni". Esse però possono essere ottenute dalle "permutazioni" relative alle singole "combinazioni".
    Infatti 5040=D(10,4)=C(10,4)*P(4).
  • Re: Numero Casuale

    Cursore ha scritto:


    J.acopo ha scritto:


    Salve ha tutti, sto sviluppando un piccolo programma che necesitta l'utilizzo di un numero casuale scelto da una scala di numeri da 0 a 9.
    In pratica il mio programma inizia con un ciclo while:
    
    bool y=false
    while(y==false){
    ...
    ...
    y=(equazione)
    }
    
    Quindi, ciò che deve fare, è provare tutti i valori possibili in modo da rendere vera l'equazione.
    Ho già letto che sarebbe opportuno utilizzare il comando rand(), ma ho anche notato che dopo una decina di esecuzioni seleziona sempre gli stessi numeri.
    Così ho provato il comando srand() per inizializzare ogni volta la scelta dei numeri casuali (da quanto ho capito) basandosi sul tempo in secondi trascosrso dal 1/1/1970.
    Da quanto vedo il metodo funziona, ma comunque ripete lo stesso numero per 1s (che concide con una trentina di esecuzioni) e vorrei scegliesse un numero diverso ad ogni esecuzioni. Consigli?

    In secondo luogo, poichè ho 4 incognite e devo scegliere un valore casuale differente per ognuna, posso fare in modo di "escludere" il valore scelto per la prima incognita nella scelta del valore casuale per la seconda?
    Per esempio, se nel primo rand()%10 viene scelto il numero 7, posso fare in modo che nel secondo rand() esso attinga il valore casuale da una scala che va da 0 a 9, ma sprovvista del numero 7?
    Si puoi escludere il numero precedente come il codice che ti ho preparato qui sotto, si potrebbe anche escludere anche tutti i numeri che hai generato ed intercettare il numero in una posizione delle 4 che compongono il numero, ma questo non è nel codice.
    
    // By Cursore su Forum IProgrammatori
    
    #include "stdafx.h"
    #include <iostream>
    
    // Routine di ingresso
    int main()
    {
    	int Z;
    	int QTiri = 0; // Indica la quantità di numeri casuali validi generati
    	int ValoreCasuale = 0; // Indica il valore del nuovo numero casuale
    	int NumeroEscluso = -1; // Indica il valore del numero da escludere (l'IMMEDIATAMENTE precedente), inizializzo a -1 perchè è un valore non estraibile
    
    	srand(time_t(NULL));  // <<<---------- Qui è OK!!! 
    
    	do
    	{
    		std::cout << " \n Premere [1] e [invio] per generare un nuovo numero casuale \n";
    		std::cout << " Premere un tasto diverso e [invio] per terminare \n";
    		std::cout << "\n\n";
    
    	std::cin >> Z;
    	
    	// Se si preme [1] si genera un nuovo numero casuale
    	if (Z == 1)
    	{
    		std::cout << " ________________\n ";
    		std::cout << "QTiri = " << QTiri + 1 << " / 20" ;
    		std::cout << "\n ________________\n ";
    		std::cout << " || Valore casuale = ";
    		
    		// Genero il numero casuale e ripeto la generazione SOLO se il nuovo numero è uguale a quello IMMEDIATAMENTE PRECEDENTE
    	    // Nota: per generare un numero diverso da tutti quelli estratti bisogna agire diversamente
    		do
    		{
    			// srand(time_t(NULL));  // <<<---------- Qui NO !!! 
    			ValoreCasuale = rand() % 10;
                // Fin quando il numero generato è uguale a quello precedente estratto allora ripeto la generazione			
    		} while (ValoreCasuale == NumeroEscluso);
    
    		QTiri = QTiri + 1; // 
    
    		// Numero casuale VALIDO e non uguale al numero immediatamente precedente estratto
    		std::cout << ValoreCasuale;
    		if (QTiri >1)
    		{
    		std::cout << " || Ho escluso il numero ";
    		std::cout << NumeroEscluso;
    		std::cout << "\n";
    
    		}
    		NumeroEscluso = ValoreCasuale; // Escluso per il prossimo tiro
    		
    	}
    
    	if (Z != 1)
    	{
    		return 0;
    	}
    	 		
    
    	// Ripeto fin quando non ho generato 20 tiri
    	} while (QTiri<=20);
    
        return 0;
    }
    
    
    In realtà la soluzione proposta ha un problema di fondo: se si scartano i valori generati dalla srand() si altera la distribuzione dei numeri pseudorandom...
  • Re: Numero Casuale

    J.acopo ha scritto:


    Comunque il tipo di equazione che ho è:
    ABCD+BADD=CCCD
    1230+2100=3330
    Quindi in pratica vorrei fare in modo che il programma testi tutte le combinazioni possibili, fino a trovare quella precedentemente mostrata (quindi A=1, B=2, C=3, D=0)
    Sono riuscito ad implementare l'idea che avevo proposto in precedenza e ho riscontrato che questa è solo una delle 32 possibili soluzioni!

    D'altronde analizzando il problema risulta evidente che D=0, e dovendo essere A e B cifre diverse la cui somma sia minore di 10, ci sono 16 possibili combinazioni e quindi in totale, essendo A e B interscambiabili, 32 soluzioni.
Devi accedere o registrarti per scrivere nel forum
19 risposte