Numeri casuali in c

baldo891
ciao,
mi potreste indicare una dispensa che tratti la generazione di numeri casuali in c
grazie

Risposte
apatriarca
Non è che ci sia molto da dire sulla generazione di numeri casuali in C, almeno limitandosi alle librerie standard. Le funzioni che è necessario conoscere sono infatti solo due: srand e rand. La prima deve essere chiamata una sola volta all'inizio del programma per inizializzare lo stato del generatore di numeri casuali, mentre la seconda va chiamata ogni volta si desideri ottenere un numero casuale. Una veloce ricerca con google dovrebbe restituire parecchi codici di esempio. C'è qualcosa di particolare che stai cercando? Per esempio come ottenere valori in un qualche intervallo oppure a virgola mobile o ...

baldo891
guarda ti ringrazio... no nulla in particolare, pensavo solo che ci fosse molto di più, tutto qui.. le librerie fondamentali sono ;
stdlib e time..

baldo891
per esempio.... esiste una funzione che mi permette di generare un numero casuale compreso tra 5 e 10? altrimenti se non esiste si può procedere così : genero un numero casuale compreso tra 0 e 10 se il numero x è maggiore di 5 lo tengo mentre se è inferiore a 5 faccio x+5, in questo modo ottengo numeri compresi tra 5 e 10

apatriarca
Non ci sono funzioni che lo fanno nello standard C. Normailmente si genera un numero compreso tra 0 e 5 e poi si somma 5 al risultato oppure si genera un numero tra 0 e RAND_MAX e si fa quindi un cast verso float o double. A questo punto si divide per RAND_MAX e si moltiplica per 5 e somma 5 per poi fare un cast nuovamente verso int. Più complicato e lento ma ha caratteristiche migliori. Ma spesso si usano librerie non standard...

garnak.olegovitc1
Salve baldo89,

"baldo89":
per esempio.... esiste una funzione che mi permette di generare un numero casuale compreso tra 5 e 10? altrimenti se non esiste si può procedere così : genero un numero casuale compreso tra 0 e 10 se il numero x è maggiore di 5 lo tengo mentre se è inferiore a 5 faccio x+5, in questo modo ottengo numeri compresi tra 5 e 10


Il tuo procedimento in parte si potrebbe fare, solo che se fai +5 per i numeri inferiori a 5 non ti so dire se sono più casuali.. al più dovresti iterare la generazione del numero casuale tra 0 e 10 sino a quando non ottiene un numero maggiore di 5. Per fare questo però dovresti introdurre prima del ciclo iterativo alcune istruzioni.....
Però questo processo io non lo consiglio!

Cordiali saluti

garnak.olegovitc1
Salve baldo89,
premetto che è da più di un anno che non tocco informatica, comunque sono andato a rispolverare alcuni appunti sul mio computer, è l'istruzione che io ho utilizzato è la seguente, dati due numeri a e b, interi-positivi-diversi da zero ed b>a:

{
.
.
range = (b - a);
nome_identificatore_variabile_randomica = (rand() % range) + a;
.
.
}


L'istruzione di sopra genererà un numero randomico compreso nell'intervallo [a;b-1], quindi occorre,
anche qui, fare molta attenzione all'estremo superiore che si sceglie ed incrementarlo di 1, ovvero si può scrivere anche:

{
.
.
.
c = b + 1;
range = (c - a);
nome_identificatore_variabile_randomica = (rand() % range) + a;
.
.
.
}



A questi blocchi di istruzioni aggiungerei anche la srand()...il tempo macchina......

Cordiali saluti

P.S.=Spero di non aver fatto errori, ribadisco che è da più di un anno che non tocco informatica.

baldo891
io ho fatto così, funziona perfettamente
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>
main()
{
 int i,n,y[100];
 double a,b,x[100];
 printf("Questo programma genera numeri casuali ");
 printf("Quanti numeri casuali   vuoi generare ?\n");
 scanf("%d",&n);
 printf("Da quale numero vuoi iniziare a generare numeri casuali?\n");
 scanf("%lf",&a);
 printf("Fino a quale numero vuoi generare numeri casuali?");
 scanf("%lf",&b);
 srand(time(NULL));
 i=1;
         while (i<=n)
                {
                 y[i]=rand(); 
                 x[i]=b*y[i]/RAND_MAX;
                          if (x[i]>=a)
                                   {
                                    printf("%lf \n",x[i]);
                                     i++;
                                   }
                }
}
       



Rispondi
Per rispondere a questa discussione devi prima effettuare il login.