PDA

View Full Version : [Semplice] Numeri random negativi...


>|HaRRyFocKer|
10-11-2006, 12:22
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...?

andbin
10-11-2006, 12:33
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...?Linguaggio di programmazione??

>|HaRRyFocKer|
10-11-2006, 12:39
Linguaggio di programmazione??

OPS è vero! :D
C++

morskott
10-11-2006, 12:50
in pseudocodiceint numeroRandom=generaRandomPositivo;
if (generaRandomPositivo>generaRandomPositivo)
return -numeroRandom;
else
return numeroRandom

andbin
10-11-2006, 12:50
OPS è vero! :D
C++Te lo scrivo in "C", tanto le funzioni da usare sono srand/rand, sia in C che C++.
#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;
}

>|HaRRyFocKer|
10-11-2006, 13:03
Te lo scrivo in "C", tanto le funzioni da usare sono srand/rand, sia in C che C++.
#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;
}


Thanks... Anche se metà del codice non l'ho capito, ma vabbè, fa niente :D

andbin
10-11-2006, 13:05
Mi sono scordato di includere <time.h>!

>|HaRRyFocKer|
10-11-2006, 13:07
Mi sono scordato di includere <time.h>!

Si si me ne sono accorto grazie ;)

leox@mitoalfaromeo
10-11-2006, 13:43
ma più semplicemente si potrebbe fare una roba tipo
return numero_random*(-1)^(rand(time(NULL)%100)

così quando l'esponente è pari ritorna positivo altrimenti negativo..

andbin
10-11-2006, 14:01
return numero_random*(-1)^(rand(time(NULL)%100)La riga che hai scritto non ha molto senso, per 2 motivi almeno:
- 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.

Ziosilvio
10-11-2006, 14:16
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...?
Qualcosina la trovi QUI (http://www.hwupgrade.it/forum/showthread.php?t=1196677).

leox@mitoalfaromeo
10-11-2006, 15:11
- rand() non ha argomenti. È alla srand() che si passa un "seme" per la inizializzazione.
continuo a confondermi con java!

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) )

cionci
10-11-2006, 15:38
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.

leox@mitoalfaromeo
10-11-2006, 16:04
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.
no.
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.

cionci
10-11-2006, 16:26
no.
il discorso è che il generatore casuale spara un numero di tipo:
0.32439342553
e poi
0.95648823496

Il generatore casuale del C/C++ spara interi da 0 a RAND_MAX ;)
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 ;)

>|HaRRyFocKer|
10-11-2006, 18:12
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 :stordita: ) 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! :D

cionci
10-11-2006, 18:18
Se non hai esigenze particolari va bene anche come hai detto...

segno = rand()%2;
if(segno == 0)
numero = -rand();
else
numero = rand();

>|HaRRyFocKer|
10-11-2006, 18:24
Se non hai esigenze particolari va bene anche come hai detto...

segno = rand()%2;
if(segno == 0)
numero = -rand();
else
numero = rand();
Perchè non mi funziona!? :cry: :muro:

Io ora ci riprovo... POi nel caso farò sapere :D

>|HaRRyFocKer|
10-11-2006, 18:33
Ora mi funziona... :mbe:

Thanks a tutti... :)

icecube_HU
10-11-2006, 18:46
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 :stordita: ) 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! :D

Scusate se intervengo, forse non ho ben capito il problema iniziale, ma... mi sembra un lavoro dell' Ufficio Complicazioni Affari Semplici !

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....??? :confused:

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 ! :) )

>|HaRRyFocKer|
10-11-2006, 19:53
- - - CUT - - -

Ehm in effetti non ci avevo pensato... E' buona come idea! :D

Ma cmq ti ho detto, non è che mi importava più di tanto l'economicità del codice, dovevo solo arrivare a fare quello... ;)

Grazie lo stesso... :)

Cmq mi lascio andare ad una considerazione sulla sezione che non avevo mai frequentato... Non mi aspettavo tanta partecipazione... :)
Pollice su! La frequenterò più spesso...

AMD_GO
10-11-2006, 20:38
Ciao....

si potrebbe fare pure così:

-------------------------------------
srand(time(NULL));

for (i=0; i<n; i++)
num_random=-50+rand()%101;
-------------------------------------

così ti genera n numeri casuali tra -50 e 50, il range poi te lo aggiusti te.... ;)

>|HaRRyFocKer|
11-11-2006, 08:29
Ciao....

si potrebbe fare pure così:

-------------------------------------
srand(time(NULL));

for (i=0; i<n; i++)
num_random=-50+rand()%101;
-------------------------------------

così ti genera n numeri casuali tra -50 e 50, il range poi te lo aggiusti te.... ;)

Beh si, in effetti è quello che ha detto IceCube... :)