|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 | |
|
Junior Member
Iscritto dal: Jan 2011
Messaggi: 7
|
[C++] Problema con pseudo numeri random
Salve a tutti, sono nuovo, e il mio nickname non è il mio nome, ma la semplice traslitterazione (nonché traduzione molto villana) di "Jonny Greenwood" (chitarrista dei Radiohead). Ma non sono qui per parlare di questo, o di me.
Entriamo subito nel problema, sto facendo un programma in C++, il cui fine è quello di simulare i giochi di archimede (quelli che si svolgono ogni anno nel triennio delle scuole superiori). Difatti noi diamo di base le risposte esatte, e facciamo tirare a caso n giocatori (il cui numero sceglieremo noi ovviamente); se le risposte a caso dovessero combaciare con le risposte esatte date come costanti, alla somma finale si aggiungono 5 punti, se sbagliate, 0. Il problema però non sorge in questa parte, tutto funziona, ma sorge nella creazione dei numeri casuali, vi riporto il codice sorgente del programma con l'errore che ipotizzo (ripreso citando wingman87 in un post simile) sia la fonte dei tanti problemi. Quote:
Grazie dell'attenzione! |
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
lo inizializzi una volta fuori dal ciclo e poi usi rand per generare il seed nel for? :E
|
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Mar 2008
Messaggi: 267
|
Nel tuo programma ci sono 2 errori concettuali:
1) Usi un ciclo for per inizializzare il generatore pseudorandom: il time() ha una precisione di 1 secondo (quindi cambia di secondo in secondo, e non millisecondo). 2) Il generatore pseudorandom dev'essere inizializzato una volta sola in tutto il programma (all'inizio), non ogni volta che esegui la funzione rand().
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
infatti non capisco la necessità di cambiare il seed, ma se proprio vuoi farlo puoi fare come ho detto
|
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Mar 2008
Messaggi: 267
|
E' inutile, perché tanto il seed rimane sempre lo stesso (il programma viene eseguito in modo velocissimo, invece il seed cambia solo di secondo in secondo).
|
|
|
|
|
|
#6 | |
|
Junior Member
Iscritto dal: Jan 2011
Messaggi: 7
|
Vi ringrazio per la velocità con cui mi avete risposto e l'interesse mostratomi. (fdskajfadsnfkja)
Allora, ho fatto così perché mettendo il generatore pseudorandom all'inizio, e richiamandolo poi, veniva sempre lo stesso numero. Allora ho provato a inserirlo in ogni for, so che ha poco senso, ma pensavo che in questo modo il programma impiegasse più tempo per fare i calcoli e magari dare un numero diverso, ma è sempre lo stesso numero. Quote:
|
|
|
|
|
|
|
#7 | |
|
Member
Iscritto dal: Mar 2008
Messaggi: 267
|
Quote:
|
|
|
|
|
|
|
#8 |
|
Junior Member
Iscritto dal: Jan 2011
Messaggi: 7
|
Ok, quindi non devo fare altro che scrivere questo all'inizio del corpo?
srand((unsigned)time(0)); random_integer = (rand()%5)+1; e poi richiamare random_integer ? |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
no wait, se random_integer è una variabile, l'espressione viene valutata una volta, al momento dell'assegnamento, dopo di che se non cambi tu il valore (facendo un altro assegnamento del tipo random_integer = (rand()%5)+1) quel valore non cambia
per fare quella cosa dovresti scrivere una funzione random_integer() del tipo Codice:
int random_integer(void)
{
return (rand()%5)+1;
}
Codice:
#define RANDOM_INTEGER() (rand()%5)+1 |
|
|
|
|
|
#10 | |
|
Junior Member
Iscritto dal: Jan 2011
Messaggi: 7
|
(scusate i miei eventuali errori concettuali, ma è da poco che sono entrato nel mondo del linguaggio di programmazione, e ho delle lacune a cui dovrò porre rimedio prima o poi!)
Ok, allora l'ho scritto così. Però sorge un altro problema. Quello che non ho detto è che alla fine del programma, dove aver fatto tirare n giocatori a nostra scelta, dobbiamo confrontare ogni risposta di ogni giocatore con quelle date (che sono 25 e non 5, qui riporto il programma versione estesa..) e poi calcolare il risultato di ogni giocatore per poi fare media e deviazione standard del risultato finale. Qui in questa "versione" ciò non potrà mai essere espresso, poichè ho messo un sommarc1,2,3.. ecc, 25, che prenderà non so che cosa (alla fine facendo la media viene un risultato molto grande, 6 cifre!) e è sbagliato. Come potrei fare per dichiarare un vettore, o qualcosa del genere, che possa raccogliere in esso tutte le risposte 1, tutte le risposte 2, tutte le risposte 3 ecc ecc e poi sommarle alla fine? Del tipo, in ogni "for" dichiarare vettore[n] = ... la mia idea era questa, ma non so da dove partire per formalizzarla. Continuo a ribadire di esservi immensamente grato. Quote:
Ultima modifica di giovanniverdelegno : 09-01-2011 alle 21:03. Motivo: errori nel corpo del programma di copiatura |
|
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Mar 2008
Messaggi: 267
|
La variabile random_integer non ti serve.
Il define mettilo fuori dal main, magari appena sotto gli include. Poi quando vuoi ottenere un numero random, ti basta fare: Codice:
variabile = random_integer(); int vettore[25]; Se poi le vuoi sommare ti basta fare un ciclo for, qualcosa del genere: Codice:
int somma = 0;
for (int i = 0; i < 25; i++)
{
somma += vettore[i];
}
|
|
|
|
|
|
#12 | |
|
Junior Member
Iscritto dal: Jan 2011
Messaggi: 7
|
Scusami, forse non mi sono spiegato bene. Guarda/ate un attimo ai 25 cicli for posti per le 25 domande. Ipoteticamente questi cicli servono a "incanalare" i vari 5 o 0 (risposta giusta o errata) in un determinato vettore per poi alla fine sommarli tutti quanti insieme per ottenere la media. Ho provato a fare qualcosa del genere, ma nel testo riportato precedentemente ciò non può avvenire, ho chiaramente sbagliato.
Ora nei for ho provato ad aggiungere un'altra piccola variante: Quote:
Come fare? Grazie 10^3. Ultima modifica di giovanniverdelegno : 10-01-2011 alle 14:51. Motivo: errori di battitura |
|
|
|
|
|
|
#13 | |
|
Junior Member
Iscritto dal: Jan 2011
Messaggi: 7
|
Quote:
Il problema ora è che quel "somma1", che poi dovrà andare a sommarsi con somma2, somma3, somma4....somma25, funziona, ma c'è un errore concettuale dietro. (Ah ho messo tutti quei cout per vedere che cosa fa, ovviamente li toglierò). ![]() Ok, penso che l'immagine parli da sé. Magari ci arriverò io a breve, ma non capisco come fare.. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:04.





















