Anonimo
Anonimo ha chiesto in Computer e InternetProgrammazione e Design · 1 decennio fa

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 :)

Aggiornamento:

scusate, correggete questa riga, altrimenti alcuni numeri escono uguali:

controllo=controllo_numeri_uguali(vettore, i, x);

Aggiornamento 2:

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

Aggiornamento 3:

se M=90-->genera numeri da 0 a 89, quindi basta incrementare di 1 per ottenere da 1 a 90

Giusto?

1 risposta

Classificazione
  • 1 decennio fa
    Risposta 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

Altre domande? Fai una domanda e ottieni le risposte che cerchi.