View Full Version : problema generazione numeri casuali C++
arsenico2009
30-01-2014, 15:10
LINK PROGRAMMA (https://www.dropbox.com/s/93hsu2sjbzfchyf/numeri_%20casuali.cpp)
ho creato un programma che deve generare 100 numeri casuali in due modi:
1. numeri casuali tutti diversi
2. numeri casuali con la possibilità di trovare alcuni uguali
una volta generati deve salvarli in un file nella stessa directory del programma.
se effettuo la seconda scelta mi crea il file ma trovo tutti i numeri generati uguali.
Come mai ??
1. la prima scelta non funziona in quanto essendo che genera tutti i i numeri uguali mi fa andare in loop l'algoritmo.
tomminno
30-01-2014, 15:37
srand dovresti chiamarlo 1 volta sola.
Dato che time ha la precisione di 1 secondo ci sta che richiami generaNumeri e che il seed sia sempre lo stesso, per questo ottieni sempre gli stessi numeri
arsenico2009
30-01-2014, 15:46
in pratica cosa devo spostare al codice ?
arsenico2009
30-01-2014, 15:47
#include<iostream>
#include<cstdlib>
#include<fstream>
#include<ctime>
using namespace std;
const int N=100;
void stampaSuFile(int numeri[N]);
bool schermoScelta();
void caricaNumeri(int numeri[N], bool diversi);
int generaNumeri();
int main(){
int numeri[N];
bool diversi=schermoScelta();
caricaNumeri(numeri, diversi);
stampaSuFile(numeri);
}
bool schermoScelta(){
int scelta;
cout<<"Questo programma genera numeri casuali "<<endl;
cout<<"--------------------------------------------"<<endl;
cout<<"1. numeri casuali diversi"<<endl;
cout<<"2. numeri casuali con la possibilita' di trovarne alcuni uguali"<<endl;
cin>>scelta;
if (scelta==1)
return true;
if (scelta==2)
return false;
}
void caricaNumeri(int numeri[N], bool diversi){
if (diversi==false){
for (int i=0; i<N; i++) {
numeri[i]=generaNumeri();
}
}else{
for (int i=0; i<N; i++){
ripeti:
numeri[i]=generaNumeri();
for (int j=i-1; j>=0; j--){
if (numeri[i] == numeri[j]){
goto ripeti;
}
}
}
}
}
int generaNumeri(){
srand(time(NULL));
int numero=rand()%100+1;
return numero;
}
void stampaSuFile(int numeri[N]){
string nome = "numeri_casuali.txt";
ofstream flusso(nome.c_str());
for (int i=0; i<N; i++){
flusso << numeri[i] << endl;
}
flusso.close();
}
vendettaaaaa
30-01-2014, 18:30
Se usi Visual Studio 2012, o GCC 4.8, cmq un compilatore che supporti il nuovo standard C++11:
#include <random>
using namespace std;
int my_rand()
{
int lowerBoundInclusive = 1;
int upperBoundInclusive = 6;
random_device rd; // Genera numeri casuali
mt19937 engine{ rd() }; // Motore di generazione di numeri casuali da passare ad una uniform_int_distribution
uniform_int_distribution<int> uid{ lowerBoundInclusive, upperBoundInclusive }; // Costruisco una uniform_int_distribution che restituisca numeri nel range indicato
int randomNumber = uid(engine); // Chiama l'operatore() della uniform_int_distribution, passandogli il motore
return randomNumber;
}
for (int i=0; i<N; i++){
ripeti:
numeri[i]=generaNumeri();
for (int j=i-1; j>=0; j--){
if (numeri[i] == numeri[j]){
goto ripeti;
}
}
}
Teoricamente, quel loop potrebbe non finire mai.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.