View Full Version : numeri casuali
puntovale
26-03-2006, 18:26
salve! avrei la necessità di generare (usando c) un numero casuale reale compreso tra -1 ed 1 sapreste dirmi come posso fare ??
repne scasb
26-03-2006, 19:09
time_t t;
double r;
srand((unsigned)time(&t));
r=rand()*2.0/RAND_MAX-1;
Considera la seguente istruzione:
i = rand ();
la funziona rand ti genera un numero compreso tra 0 e rand_max!
Ciauz, Alberto. ;)
Ziosilvio
26-03-2006, 23:01
Come ti hanno già detto repne scasb prima e Albozzo poi, in stdlib.h è dichiarata una funzione rand, che restituisce un intero uniformemente distribuito tra 0 e RAND_MAX inclusi. Di questo generatore pseudorandom devi inizializzare casualmente il seme, ossia il valore di partenza, per esempio leggendo l'ora di sistema.
Se vuoi generare dei numeri in virgola mobile tra a incluso e b escluso, la cosa che ti conviene fare è partire da una funzione che ti generi un numero casuale in virgola mobile tra 0 incluso e 1 escluso:
double frand() {
return rand() / (RAND_MAX+1.0);
}
e poi fare qualcosa tipo:
x = a + frand()*(b-a);
Se vuoi includere anche b, allora devi dividere per RAND_MAX anziché per RAND_MAX+1.0: ma allora, nel codice di frand devi ricordarti di convertire rand() oppure RAND_MAX in double prima di effettuare la divisione, altrimenti frand restituirà sempre 0.0. (Il problema non sussiste nella versione con RAND_MAX+1.0, che è un double di suo.)
tomminno
27-03-2006, 09:09
Se non ti serve un numero casuale affidabile basta rand(), altrimenti se hai veramente la necessità di un numero casuale più casuale devi cercare un algoritmo più serio, prova sui Numerical Recipes.
repne scasb
27-03-2006, 10:40
Se non ti serve un numero casuale affidabile basta rand(), altrimenti se hai veramente la necessità di un numero casuale più casuale devi cercare un algoritmo più serio, prova sui Numerical Recipes.
Il limite principale di rand(), non e' tanto la casualita', ma il fatto che e' un generatore di numeri casuali generante un numero "finito" (o meglio limitato) di numeri casuali.
Un esempio chiarira' meglio il concetto: se ho la necessita' di generare numeri casuali compresi tra 0 e N (interi ad esempio), e se N>RAND_MAX allora e' chiaro che alcuni numeri N non "appariranno mai" nella sequenza di numeri casuali generati da rand(). Questo e' realmente un grosso limite (distribuzioni multiple, interferenza...), che si supera con l'uso di funzioni di generazione di numeri casuali piu' avanzate. Un possibile palliativo utilizzando la funzione standard 'rand()' potrebbe essere (codice scritto in C--):
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define N_RAND_NUMS 100
void main(void)
{
time_t t;
double r;
int i;
double double_rand_nums[N_RAND_NUMS],single_rand_nums[N_RAND_NUMS];
srand((unsigned)time(&t));
for(i=0;i<N_RAND_NUMS;i++)
single_rand_nums[i]=rand();
srand(~t);
for(i=0;i<N_RAND_NUMS;i++)
double_rand_nums[i]=rand()+single_rand_nums[i]*RAND_MAX;
for(i=0;i<N_RAND_NUMS;i++)
printf("%f\n",double_rand_nums[i]);
}
puntovale
27-03-2006, 12:38
ok grazie mille ragazzi oggi proverò le vostre soluzioni. In realtà andrebbero bene anche numeri casuali tra -1 e 1 con precione decimale (in pratica -1 , -0.9 -0.8.... 0.1 0.2 0.3 ....etc)
In python ho la possibilità di definire una lista di numeri e poi scegliere casualmente in questa lista. Che voi sappiate esiste questa possibilità in C ??
Ziosilvio
27-03-2006, 14:26
andrebbero bene anche numeri casuali tra -1 e 1 con precione decimale (in pratica -1 , -0.9 -0.8.... 0.1 0.2 0.3 ....etc)
Ricordati in ogni caso di passare per la frand, perché se rand è implementata con un generatore sequenziale lineare di periodo P=2^K e se N è un divisore di P, allora rand() % N sfrutta solo le cifre meno significative di rand: in particolare, ha periodo N e non P.
In python ho la possibilità di definire una lista di numeri e poi scegliere casualmente in questa lista. Che voi sappiate esiste questa possibilità in C ??
Nella libreria standard, no: devi implementare un metodo tu.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.