View Full Version : [C]Generazione di numeri random
Salve a tutti, qualcuno mi potrebbe gentilmente dire come si genera un intero random compreso tra zero e 10, usando il c?
redcloud
12-03-2006, 17:57
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
int main() {
int i=0;
srand(time(NULL));
for(i=0; i <10; i++) {
printf("%d ", rand( ) % 11);
}
system("pause"); // se usi devc
}
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
int main() {
int i=0;
srand(time(NULL));
for(i=0; i <10; i++) {
printf("%d ", rand( ) % 11);
}
system("pause"); // se usi devc
}
Ok, grazie. Io uso cygwin quindi system("pause"); non serve vero?
Poi volevo sapere, io il valore non lo devo stampare ma usarlo in una espressione quindi dovrebbe bastarmi rand( ) % 11 giusto?
Solo per curiosità perché prendo il resto della divisione per 11?
Ziosilvio
12-03-2006, 19:17
printf("%d ", rand( ) % 11);
Chiamare "rand() % N" per generare un numero pseudorandom tra 0 e N-1, ha lo svantaggio di usare solo le cifre meno significative del valore restituito da rand --- il che, se rand non è molto sofisticata, può dare un generatore con cattive proprietà.
Un modo per stare un po' più tranquilli è trasformare il valore di rand in un valore in virgola mobile uniforme tra 0 incluso e 1 escluso, e poi moltiplicare per N e prendere la parte intera.
Ad esempio:
int irand(int range) /* valore pseudorandom tra 0 e range-1 */
{
return (int)(((double)rand()/(RAND_MAX+1))*range);
}
int irand(int range) /* valore pseudorandom tra 0 e range-1 */
{
return (int)(((double)rand()/(RAND_MAX+1))*range);
}
Va sicuramente bene ma bisogna vedere quanto vale realmente RAND_MAX!! In certe implementazioni, RAND_MAX è uguale al massimo valore positivo per un intero. Facendo +1 ci sarebbe l'overflow! (e il valore diventerebbe negativo).
Su VC++ (.NET 2003) RAND_MAX vale 0x7FFF mentre su Linux (ho guardato su una Slackware) vale 2147483647.
Ziosilvio
12-03-2006, 21:21
bisogna vedere quanto vale realmente RAND_MAX!! In certe implementazioni, RAND_MAX è uguale al massimo valore positivo per un intero. Facendo +1 ci sarebbe l'overflow!
'Azz... vero!
Allora mi sa che bisogna scrivere RAND_MAX+1.0: il valore che viene fuori è un double, e (se non sbaglio) i double devono poter rappresentare correttamente tutti gli int.
E se invece si avesse bisogno di numeri casuali da -N a +N ?
basta che tiri fuori un numero tra 0 e 2N e togli N
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.