PDA

View Full Version : [C]Generazione di numeri random


dejawho
12-03-2006, 17:27
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
}

dejawho
12-03-2006, 19:10
#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);
}

andbin
12-03-2006, 19:34
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.

Nosf3r
22-04-2009, 17:49
E se invece si avesse bisogno di numeri casuali da -N a +N ?

Torav
22-04-2009, 20:14
basta che tiri fuori un numero tra 0 e 2N e togli N