Algoritmo pseudocasuale per sequenze istantanee di numeri casuali?
Deve generare una sequenza di numeri casuali sempre diversi tra loro.
Cosa ne pensate di questo algoritmo in C?
E' fatto bene?Consigli?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define DIM 6
int controllo_numeri_uguali(int v[], int dimensione, int numerouscito);
void carica_vettore(int vettore[]);
void stampa_vettore(int vet[]);
main()
{
int sestina[DIM];
carica_vettore(sestina);
stampa_vettore(sestina);
system("PAUSE");
}
void carica_vettore(int vettore[])
{
int controllo;
int i;
int a=18;
int m=7;
int x=3;
for(i=0;i<DIM;i++)
{
srand((a*x+time(0))*m);
x=rand()%91+1;
if(i>0)
{
controllo=controllo_numeri_uguali(vettore, i-1, x);
if(controllo==0)
{
vettore[i]=x;
}
else
{
i--;
}
}
else
{
vettore[i]=x;
}
}
}
void stampa_vettore(int vet[])
{
int i;
for(i=0;i<DIM;i++)
{
printf("%d\n", vet[i]);
}
}
int controllo_numeri_uguali(int v[], int dimensione, int numerouscito)
{
int i;
for(i=0;i<dimensione;i++)
{
if(v[i]==numerouscito)
{
return 1;
}
}
return 0;
}
Grazie in anticipo :)
scusate, correggete questa riga, altrimenti alcuni numeri escono uguali:
controllo=controllo_numeri_uguali(vettore, i, x);
Lineare congruenziale in modulo 90 significa che se M=90 le sequenze cominceranno a ripetersi ogni 90 numeri? Ovviamente questo accade in una serie lunga di numeri con lo stesso seme (a me basterebbe M=6 visto che mi serve solo una sequenza di 6 numeri diversi l'uno dagli altri).Correggimi se sbaglio :)
Mi affascina questo argomento
se M=90-->genera numeri da 0 a 89, quindi basta incrementare di 1 per ottenere da 1 a 90
Giusto?
1 risposta
- BluNotteLv 71 decennio faRisposta preferita
Va bene, anche se un formalista storcerebbe il naso, poiché l'algoritmo potrebbe non fermarsi mai. Di fatto, dovresti essere molto sfortunato/a affinché succeda. Per rendere il tutto formalmente corretto, basta applicare il seguente comportamento:
quando esce un numero già uscito, invece di ricalcolarne un altro casuale, incrementi quello attuale di 1.
In alternativa, potevi implementare un generatore che non ripete mai i numeri (fin quando non sono usciti tutti). Per esempio, un lineare congruenziale in modulo 90. Questo semplificherebbe di molto il codice (perché non dovresti più controllare se è già uscito), però immagino sia al di fuori degli scopi del tuo programma. Te lo posto giusto come esempio, se t'interessasse: http://pastebin.com/xB7FmUw1