Indovinelli con Scratch

In questa lezione realizzemo un gioco con gli indovinelli con Scratch.
Proporremo 4 semplici indovinelli:
1) Giro curioso nel bosco fitto e frondoso. Mi arrotolo in palla, sono piccolo e gioioso.
2) Mi nutro di insetti nell’oscurità, Un piccolo mammifero nella mia verità.
3) Nella notte mi senti cantare, Con occhi grandi posso guardare.
4) Faccio il sonnellino durante la lunga stagione. Amo miele e pesce, sono un buon pescatore!

Per individuare la risposta corretta, occorre trascinare ciascun animale sulla macchina. Se la macchina parte con l’animale vuol dire che la risposta è corretta, altrimenti la macchina cambia colore e l’animale ritorna in posizione.

Ecco una possibile implementazione del gioco indovinelli con Scratch:

C++ random

C++ random

C++ random – La libreria del linguaggio C++ include alcune funzioni per il calcolo dei numeri pseudo casuali, ovvero dei numeri random.

Avevamo già studiato in C, come generare i numeri random in questa lezione: array con numeri random in C.

Quindi analizzeremo innanzitutto la funzione rand() in C++ che serve a generare dei numeri casuali.

Prima di procedere con la spiegazione volevo evidenziare che la funzione rand() in C++ ha alcune limitazioni. In particolare

  1. Non è considerata una buona pratica per generare numeri casuali di alta qualità: Anche se rand() può essere utilizzata per scopi semplici o casuali, non è considerata efficiente per generare numeri casuali di alta qualità a causa della sua distribuzione non uniforme e della mancanza di controllo sull’algoritmo di generazione.
  2. Non è thread-safe: La funzione rand() non è thread-safe, il che significa che non può essere utilizzata in modo sicuro in contesti multithreading senza precauzioni aggiuntive per evitare interferenze tra thread.
  3. Esistono alternative migliori: Con l’avvento di C++11 e versioni successive, è consigliabile utilizzare la libreria <random> per generare numeri casuali di alta qualità. Questa libreria offre una maggiore flessibilità e controllo sulla generazione di numeri casuali e fornisce algoritmi più sofisticati per ottenere risultati migliori rispetto a rand().

In sintesi, sebbene rand() sia ancora disponibile e funzionante in C++, è preferibile utilizzare <random> per generare numeri casuali di alta qualità e thread-safe. È importante considerare le esigenze specifiche del tuo programma e scegliere l’approccio migliore in base a esse.

Maggiori dettagli e approfondimenti nel libro:

La funzione rand() genera un numero che è compreso nell’intervallo tra 0 e RAND_MAX, dove RAND_MAX è un valore che cambia a seconda del compilatore usato, ad esempio nel caso di Dev C++ è 32767.

Per provarlo basta semplicemente scrivere questo piccolo programma in cui oltre all’header iostream includeremo anche l’header cstdlib.

#include <iostream>
#include <cstdlib>
using namespace std;

#define N 10

int main(){
cout<<"RAND_MAX:"<<RAND_MAX;
}

Ma la funzione rand() dà l’impressione che il numero sia casuale.

Infatti aggiungete questa linea di codice al programma precedente:

cout<<rand()<<endl;

Noterete che il numero generato, se mandate più volte in esecuzione il programma, è sempre lo stesso.

Questo succede perché il nostro numero casuale è prodotto a partire dallo stesso seme. Allora occorre intervenire proprio su questo per generare numeri casuali diversi.


Esempi c++ random

Per generare numeri casuali in C++ potremmo inizializzare i semi utilizzando la funzione srand(). Questa funzione inizializza il generatore di numeri con un valore passato come argomento.

Ad esempio srand(112233);

Facciamo dunque un esempio inserendo in un array dei numeri pseudo-casuali.

Creiamo due semi partendo da due valori diversi. Dopo con la funzione srand() passiamo i semi come argomento e poi con la funzione rand() generiamo dei numeri pseudo-casuali che inseriremo nei nostri array a e b.

#include <iostream>
#include <cstdlib>
using namespace std;

const int seme1 = 111222333; 
const int seme2 = 112233444; 

#define N 10

int main(){
	int a[N],b[N];
	int i;

	srand(seme1);
	for (i=0; i<N; i++){		
		a[i]=rand();
	}
	
	srand(seme2);
	for (i=0; i<N; i++){
		b[i]=rand();
	}		
	
	cout<<"stampa primo array"<<endl;
	for (i=0; i<N; i++){		
		   cout<<a[i]<<endl;
	}
		
	cout<<"stampa secondo array"<<endl;
	for (i=0; i<N; i++){		
		   cout<<b[i]<<endl;
	}
	return 0;	
}

Ma ogni volta che manderemo in esecuzione il programma avremo sempre gli stessi numeri.


Uso della funzione time()

La funzione time() restituisce il numero di secondi trascorsi dal 01 Gennaio 1970 rispetto alla data e all’ora corrispondenti all’invocazione di tale funzione.

Per utilizzare questa funzione devo includere l’header ctime.

Ecco quindi il listato completo d’esempio:

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

#define N 10

int main(){
	int a[N];
	int i;

	srand(time(NULL));
	for (i=0; i<N; i++){		
		a[i]=rand();
	}	
	
	cout<<"stampa array"<<endl;
	for (i=0; i<N; i++){		
		   cout<<a[i]<<endl;
	}

	return 0;	
}

In questo modo ogni volta che manderemo in esecuzione il programma, in istanti differenti, otterremo valori diversi.


Ottenere valori random in un determinato intervallo

Adesso vedremo come generare numeri in C++ random ma in un intervallo definito.

Se utilizziamo rand()%N visualizziamo i numeri compresi tra 0 ed N-1.

Quindi ad esempio rand()%10 restituisce i numeri da 0 a 9.

Se aggiungiamo un offset l’intervallo si può modificare, ad esempio rand()%10+1 restituisce tutti i numeri da 1 a 10 anziché da 0 a 9. In pratica aggiungiamo 1 ad entrambi i numeri del range.

Quindi se ad esempio volessimo generare i numeri da 10 a 20, considerando che rand()%11 genera valori da 0 a 10, allora dovremmo aggiungere l’offset 10.

Ecco il listato completo che mostra due array inizializzati uno con i numeri random da 1 a 10 e il secondo con i numeri random da 10 a 20.

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

#define N 10

int main(){
	int a[N],b[N];
	int i;

	srand(time(NULL));
	for (i=0; i<N; i++){		
		a[i]=rand()%10+1;
	}
	
	srand(time(NULL));
	for (i=0; i<N; i++){		
		b[i]=rand()%11+10;
	}				
	
	cout<<"stampa primo array"<<endl;
	for (i=0; i<N; i++){		
		   cout<<a[i]<<endl;
	}
	
	cout<<"stampa secondo array"<<endl;
	for (i=0; i<N; i++){		
		   cout<<b[i]<<endl;
	}
		
	return 0;	
}

Questi sono solo alcuni possibili esempi sui numeri C++ random, più avanti vi mostrerò altre possibili applicazioni.

Alcuni link utili

Indice argomenti linguaggio C++

Array in C++

Passaggio di parametri per valore o per riferimento

Equazioni di secondo grado in C++

Le variabili globali e locali in C++

Uso delle funzioni in C++

Funzioni in C++

Definizione di funzioni in C++

Libreria cmath

Come usare il for in C++

Massimo tra n numeri in C++

Iterazioni in C++

Ciclo while in C++

Ciclo do while

Operatori logici in C++

Esercizi con switch case in C++

If else in C++

Casting in C++

Successione di Fibonacci in C++