Numero Casuale

di il
19 risposte

Numero Casuale

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?

19 Risposte

  • Re: Numero Casuale

    Prova a randomizzare con il Timer() (In vb.net e c# c'è Randomize(DateTime.Now...) ) oppure a generare semi anch'essi casuali.

    Il prelievo per il tempo TRASCORSO in millisecondi dal tempo di accensione del pc.
    993992839238 questo è per esempio il tempo trascorso al momento dell'accensione del tuo pc
    349499282882717366 questo per esempio è il tempo trascorso al momento dell'accensione del tuo pc fino alla nuova pressione del tasto [crea numero rnd]
    742887777992828822 questo per esempio è il tempo trascorso al momento dell'accensione del tuo pc fino alla nuova pressione del tasto [crea numero rnd]

    Esempio in Vb.Net con randomize (DateTime.Now.Millisecond)
    Qui al posto di usare il tempo trascorso utilizzi il tempo corrente dei millisecondi usati come seme di inizializzazione, e si rinizializza ad ogni pressione del pulsante
    
    Public Class Form1
        Dim ValoreCasuale = 0
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Randomize(DateTime.Now.Millisecond)  'Inizializzo il generatore
            ValoreCasuale = (Int(Rnd(1) * 10) + 1) - 1  'Ottengo un numero generato casualmente, e lo trasformo in un intero da 0 a 9
            TextBox1.Text = ValoreCasuale
        End Sub
    End Class
    
  • Re: Numero Casuale

    Potresti essere giusto un po' più chiaro...? >.< Sono ancora alle prima armi e non ho capito un gran che... potresti aggiungere qualche altro esempio?
  • Re: Numero Casuale

    Prima di aggiungere esempi lo hai letto e provato quello proposto?
  • Re: Numero Casuale

    Essenzialmente non ho capito cosa voglia intendere... per questo chiedevo qualche esempio...
  • Re: Numero Casuale

    Innanzitutto ti posto un frammento di un mio vecchio post, magari ti può essere utile...

    Nippolo ha scritto:


    I numeri pseudocasuali sono generati a partire da un valore detto seme. Per ogni valore del seme, la funzione rand() restituisce una prefissata sequenza di numeri pseudocasuali (cmq variabile da macchina a macchina). Se il seme non viene inizializzato, esso sarà inizializzato di default ad 1, ossia non richiamare la funzione srand() coincide con la chiamata srand(1). Bisogna quindi trovare un modo per inizializzare il seme con un valore diverso ogni volta che eseguiamo il programma, ma come possiamo farlo? La soluzione spesso adottata è quella di inizializzare il seme ricorrendo alla funzione time(0) (per usarla bisogna includere la libreria ctime), che restituisce un valore legato all'orario in cui il programma è stato lanciato.
    Per quanto riguarda le varie domande che poni, sinceramente non ho capito bene cosa intendi fare e non sono sicuro che quella dei numeri casuali sia la strada migliore. Perchè non posti la traccia l'esercizio oppure, se non lo è, spieghi meglio quale dovrebbe essere lo scopo del programma?!
  • Re: Numero Casuale

    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;
    }
    
    
  • Re: Numero Casuale

    Wow! Grazie mille
    Il codice da te scritto è molto chiaro e penso di aver trovato la soluzione al mio problema. Grazie mille intantoo ^-^
  • Re: Numero Casuale

    .
  • Re: Numero Casuale

    @migliorabile
    Ho preso in considerazione la tua idea, ma ho riscontrato un problema…
    Dopo aver creato il vettore
    
    vector<int> v;
    
    e averlo popolato
    
    for(int i=0; i<10; i++) v.push_back(i);
    

    devo mescolarlo... come potrei fare?
  • Re: Numero Casuale

    Probabilmente ignorerai anche questo mio post come hai fatto col precedente, ma vorrei cmq porti una domanda!

    Se ho ben capito hai un'equazione in 4 incognite e vuoi scoprire per quali valori (compresi tra 0 e 9 e che non si ripetono) risulti soddisfatta. Giusto?
    In tal caso mi chiedo cosa c'entrano i numeri casuali se quello che devi fare è provare le varie combinazioni (o più precisamente disposizioni) finché non trovi i 4 valori da assegnare alle 4 variabili in modo che l'equazione sia rispettata!
  • Re: Numero Casuale

    Scusami tanto >.<
    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)
  • Re: Numero Casuale

    Np

    Dunque ci avevo visto giusto, a questo punto però la domanda sorge spontanea... quale ragionamento ti ha portato ad introdurre i numeri casuali?

    Vorrei inoltre precisare che ciò che ti serve non sono le "combinazioni", ma le "disposizioni semplici".
    In pratica dovresti implementare una funzione che ti restituisca le diverse disposizioni di n elementi (10 in questo caso) presi k alla volta (4 in questo caso).
  • Re: Numero Casuale

    Essenzialmente reputavo che il calcolo fosse relativamente facile e quindi quella che ho scelto fosse una strada percorribile...
    Studio c++ (e l'informatica in generale) da autodidatta... quindi provo a svolgere esercizi da me inventati mediante c++ utilizzando ragionamenti che non sono sempre i migliori...
    Avendo pensato ai numeri causali vorrei ora imparare ad utilizzare questo sistema, per questo sto cercando di approfondire il metodo consigliatomi da @migliorabile .
    Ma comunque, cosa vorresti dire?
  • Re: Numero Casuale

    Anche io sono autodidatta!

    Ricorrendo a sequenze casuali, oltre a considerare più volte una stessa sequenza, corri il rischio che la soluzione non venga generata mai.

    Io invece ti consiglio di generare tutte le possibili sequenze, in modo che se la soluzione esiste hai la certezza di trovarla, se invece la soluzione non viene trovata ne dedurrai che essa non esiste.
    Le disposizioni semplici di 10 elementi presi 4 alla volta sono 5040 (tale valore può essere semplicemente calcolato ricorrendo al calcolo combinatorio). Per esempio, tanto per cominciare:

    A B C D
    __________
    0 1 2 3
    0 1 2 4
    0 1 2 5
    0 1 2 6
    0 1 2 7
    0 1 2 8
    0 1 2 9
    0 1 3 4
    0 1 3 5
    0 1 3 6
    ....

    Bisogna quindi ingegnarsi nell'implementare un algoritmo in grado di generare tutte le suddette sequenze.
    Mi è capitato già di implementare qualcosa del genere relativamente alle combinazioni, ma ovviamente si può fare anche con le disposizioni.

    La differenza tra combinazioni e disposizioni è che in queste ultime oltre agli elementi che compongono la sequenza conta anche l'ordine in cui essi si trovano. Per esempio {1 2 3} e {2 3 1} sono disposizioni diverse, ma rappresentano la stessa combinazione.

    Se qualcosa non ti è chiaro chiedi pure. Se sei interessato a questo metodo metodo di risoluzione possiamo anche rifletterci insieme.
Devi accedere o registrarti per scrivere nel forum
19 risposte