|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2003
Città: Roma / Napoli ---------------------- Vi PREGO, chiamatemi Marcello, non HarryFocker... Merci...
Messaggi: 1814
|
[Semplice] Numeri random negativi...
Ragazzi sono alle prime armi con la programmazione e stavo facendo un programma per esercitarmi che chiedeva di generare in maniera casuale dei numero positivi e negativi... Io ora ho provato tutto ciò che ho studiato per cercare di ovviare a questo problema, ma tutto ciò che alla fine mi esce sono o numeri tutti negativi o numeri tutti positivi...
C'è qualcuno che mi può aiutare...?
__________________
LOVE WILL TEAR US APART.
--- Cisco Systems CCNA Certified --- MyLastFM --- My Deviations --- Quando i 65daysofstatic si scioglieranno per problemi di droga del bassista... Io l'avevo già detto! ![]() |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Jan 2003
Città: Roma / Napoli ---------------------- Vi PREGO, chiamatemi Marcello, non HarryFocker... Merci...
Messaggi: 1814
|
Quote:
C++
__________________
LOVE WILL TEAR US APART.
--- Cisco Systems CCNA Certified --- MyLastFM --- My Deviations --- Quando i 65daysofstatic si scioglieranno per problemi di droga del bassista... Io l'avevo già detto! ![]() |
|
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Jul 2005
Messaggi: 291
|
in pseudocodice
Codice:
int numeroRandom=generaRandomPositivo; if (generaRandomPositivo>generaRandomPositivo) return -numeroRandom; else return numeroRandom |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Codice:
#include <stdio.h>
#include <stdlib.h>
int rand_int (int min, int max)
{
double d;
d = rand () / (RAND_MAX+1.0);
return ((int) (d * (max-min+1))) + min;
}
int main (void)
{
int i;
srand ((unsigned int) time (NULL));
for (i = 0; i < 30; i++)
printf ("%d ", rand_int (-10, +10));
printf ("\n");
return 0;
}
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Jan 2003
Città: Roma / Napoli ---------------------- Vi PREGO, chiamatemi Marcello, non HarryFocker... Merci...
Messaggi: 1814
|
Quote:
Thanks... Anche se metà del codice non l'ho capito, ma vabbè, fa niente
__________________
LOVE WILL TEAR US APART.
--- Cisco Systems CCNA Certified --- MyLastFM --- My Deviations --- Quando i 65daysofstatic si scioglieranno per problemi di droga del bassista... Io l'avevo già detto! ![]() |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Mi sono scordato di includere <time.h>!
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Jan 2003
Città: Roma / Napoli ---------------------- Vi PREGO, chiamatemi Marcello, non HarryFocker... Merci...
Messaggi: 1814
|
Quote:
__________________
LOVE WILL TEAR US APART.
--- Cisco Systems CCNA Certified --- MyLastFM --- My Deviations --- Quando i 65daysofstatic si scioglieranno per problemi di droga del bassista... Io l'avevo già detto! ![]() |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Dec 2005
Città: Ahimè..Bs ----------------------------------- Messaggi tot: 1000+
Messaggi: 772
|
ma più semplicemente si potrebbe fare una roba tipo
Codice:
return numero_random*(-1)^(rand(time(NULL)%100)
__________________
11/2006-Inspiron6400 -t7200|2GB@533MHz|S-ATA 80gb@7200rpm|Ati X1400|9cell Battery||garanzia 3 anni On-Site NBD ex: Toshiba M30-154 (PERCHE' NON COMPRARE TOSHIBA..LEGGI QUI) + P4 2.8@3,2GHz 1MB L2, Gigabyte 915p-duo,1GB DDR400 DualCh, gF 6600gt 128MB GDDR3 + Canon Ixus50 + Creative Muvo^2 1.5GB |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
- Usare 2 numeri casuali, uno per il segno e l'altro per il numero vero e proprio non credo che sia una buona soluzione. Dal punto di vista della generazione "pseudo-casuale" dei numeri, intendo. - rand() non ha argomenti. È alla srand() che si passa un "seme" per la inizializzazione.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#11 | |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16212
|
Quote:
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Ahimè..Bs ----------------------------------- Messaggi tot: 1000+
Messaggi: 772
|
Quote:
sul primo discorso invece non sono affatto d'accordo. Generando un numero casuale tra 0 e 99 (o eventualmente gradi maggiori tipo 0-999 o 0-999999999) considero (nel valutare se sia pari o dispari) un decimale successivo a quelli che determinano il numero che do in output (che è tra -10 e 10) quindi i due (numero e segno) sono assolutamente indipendenti. inoltre ovviamente se la distribuzione di rand è uniforme la probabilità di ottenere un numero pari è la stessa di ottenerne uno dispari. ad ogni modo per l'esponente di (-1) si può usare anche qualche altro parametro, tipo il tempo del sistema (ma non so come andarlo a pigliare: tipo (-1)^time(NULL) )
__________________
11/2006-Inspiron6400 -t7200|2GB@533MHz|S-ATA 80gb@7200rpm|Ati X1400|9cell Battery||garanzia 3 anni On-Site NBD ex: Toshiba M30-154 (PERCHE' NON COMPRARE TOSHIBA..LEGGI QUI) + P4 2.8@3,2GHz 1MB L2, Gigabyte 915p-duo,1GB DDR400 DualCh, gF 6600gt 128MB GDDR3 + Canon Ixus50 + Creative Muvo^2 1.5GB Ultima modifica di leox@mitoalfaromeo : 10-11-2006 alle 16:14. |
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Il problema è che i numeri sono pseudo-casuali...quindi due estrazioni consecutive hanno un certo legame...facendo r1^r2 non si aggiunge impredicibilità...anzi, ad occhio la si riduce, ma ci sarebbero da fare un po' di controlli sull'algoritmo per saperlo.
La soluzione migliore resta quindi quella di andbin, almeno imho. |
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Ahimè..Bs ----------------------------------- Messaggi tot: 1000+
Messaggi: 772
|
Quote:
il discorso è che il generatore casuale spara un numero di tipo: 0.32439342553 e poi 0.95648823496 tu per prendere i numeri da 1 a 10 usi max le prime 2 cifre decimali, delle altre te ne fotti.. per il segno se usi %1000 prendi la 3a cifra decimale che è indipendente dalle precedenti.. cmq, dal punto di vista matematico, il metodo migliore che non toglie generalità è il (-1)^esponentevariabile. Infatti in tutte le dimostrazioni matematiche viene utilizzato per definire il segno. Poi in "esponentevariabile" metteteci la funzione che volete.
__________________
11/2006-Inspiron6400 -t7200|2GB@533MHz|S-ATA 80gb@7200rpm|Ati X1400|9cell Battery||garanzia 3 anni On-Site NBD ex: Toshiba M30-154 (PERCHE' NON COMPRARE TOSHIBA..LEGGI QUI) + P4 2.8@3,2GHz 1MB L2, Gigabyte 915p-duo,1GB DDR400 DualCh, gF 6600gt 128MB GDDR3 + Canon Ixus50 + Creative Muvo^2 1.5GB |
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Se supponi che sequenza pseudo-casuale che spara fuori sia distribuita abbastanza uniformemente allora dividere il numero generato per RAND_MAX+1 mantiene una distribuzione uniforme. Quindi a questo punto hai un numero con distribuzione uniforme fra 0 e 1... Usando il modulo già la distribuzione non diventa uniforme. Discriminando il segno con un altro numero casuale perdi ancora di più uniformità perchè rendi il legame (che c'è) fra i due numeri consecutivi estratti (uno per il modulo e l'altro per il segno) ancora più stretto. Almeno IMHO |
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Jan 2003
Città: Roma / Napoli ---------------------- Vi PREGO, chiamatemi Marcello, non HarryFocker... Merci...
Messaggi: 1814
|
Certo che a volte un problema matematicamente così banale fa un casino di pazzi a livello di programmazione...
Io poi, dato che l'esercizio lo dovrò mandare al prof, non posso utilizzare l'algoritmo di andbin perchè credo si noti che ci sono cose che non abbiamo fatto... Io però avevo un'altra idea che renderebbe il codice più pesante e molto meno economico, ma che però funziona sicuramente ed è alla mia portata... Avevo intenzione di generare un secondo numero casuale int qualsiasi per poi farlo %2. Creare poi un if secondo il quale se questo numero è uguale a 0, moltiplicare il primo numero *(-1) (rendendo il numero quindi negativo) e se invece uguale a 1 lasciarlo così com'è... Ora però io ho provato a fare questa cosa, però non capisco il motivo per il quale questo non funziona... A livello sintattico (e anche logico credo ) la cosa è corretta, però non mi va...Insomma diciamo emulando un valore booleano... Se poi mi dite come faccio a generare un bool casuale con rand sarebbe ancora meglio!
__________________
LOVE WILL TEAR US APART.
--- Cisco Systems CCNA Certified --- MyLastFM --- My Deviations --- Quando i 65daysofstatic si scioglieranno per problemi di droga del bassista... Io l'avevo già detto! ![]() Ultima modifica di >|HaRRyFocKer| : 10-11-2006 alle 19:15. |
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Se non hai esigenze particolari va bene anche come hai detto...
segno = rand()%2; if(segno == 0) numero = -rand(); else numero = rand(); |
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Jan 2003
Città: Roma / Napoli ---------------------- Vi PREGO, chiamatemi Marcello, non HarryFocker... Merci...
Messaggi: 1814
|
Quote:
Io ora ci riprovo... POi nel caso farò sapere
__________________
LOVE WILL TEAR US APART.
--- Cisco Systems CCNA Certified --- MyLastFM --- My Deviations --- Quando i 65daysofstatic si scioglieranno per problemi di droga del bassista... Io l'avevo già detto! ![]() |
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Jan 2003
Città: Roma / Napoli ---------------------- Vi PREGO, chiamatemi Marcello, non HarryFocker... Merci...
Messaggi: 1814
|
Ora mi funziona...
Thanks a tutti...
__________________
LOVE WILL TEAR US APART.
--- Cisco Systems CCNA Certified --- MyLastFM --- My Deviations --- Quando i 65daysofstatic si scioglieranno per problemi di droga del bassista... Io l'avevo già detto! ![]() |
|
|
|
|
|
#20 | |
|
Member
Iscritto dal: May 2006
Messaggi: 71
|
Quote:
Allora, premesso che sai generare un numero random positivo, poniamo tra 0 e 100. Ora tu vuoi generare numeri casuali tra -50 e +50: basta sottrarre 50 al numero generato col sistema precedente ! Perche' mai andarsi a complicare la vita generando un segno random con cose del tipo (-1)^N....??? E' piu' semplice, non altera la distribuzione di frequenze, ed e' piu' efficiente e veloce ! (...se non si fosse capito, e' quanto faceva il codice di andbin ! Ultima modifica di icecube_HU : 10-11-2006 alle 19:55. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:55.












) la cosa è corretta, però non mi va...








