C - rand() - un po' più rand ..
Ciao a tutti,
Stavo scrivendo un piccolo programma in C in grado di generare delle stringhe di caratteri generati pseudocasualmente, con la funzione rand() e lunghezza della stringa a scelta.
Il codice scritto è questo:
Ho successivamente testato, con la classica generazione del seme del codice precedente, quante volte potrebbe essere ripetuto lo stesso risultato per n esecuzioni, con la seguente stringa di comando:
La quale esegue il programma compilato con nome file 300 volte.
Il risultato è peggio di quello che mi aspettavo. Le stringhe non sono tutte diverse e viene generata una sequenza diversa ogni 100 esecuzioni circa.
Successivamente ho applicato questa modifica alla generazione del seme:
Ho salvato il file come file2.c ed eseguendo n volte con il comando sopra riportato, si può osservare come il risultato ovviamente migliora nettamente.
Non so, magari è qualcosa che gli utenti che masticano il C da anni sapevano già da tempo, però io volevo farlo presente nel caso qualcuno volesse generare delle sequenze di numeri (e non) casuali in un lasso breve di tempo.
Se qualcuno conocesse metodi più casuali sarebbe interessante condividerli.

Stavo scrivendo un piccolo programma in C in grado di generare delle stringhe di caratteri generati pseudocasualmente, con la funzione rand() e lunghezza della stringa a scelta.
Il codice scritto è questo:
- Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>
#include <libgen.h>
#include <time.h>
int main(int argc, char *argv[])
{
if(argc != 2)
{
printf("\nusage: %s n\n", basename(argv[0]));
printf("where \'n\' is the string lenght\n\n");
exit(1);
}
else
{
srand(time(NULL));
int i = 0;
int N = atoi(argv[1]);
while(i < N)
{
printf("%c", 32 + rand() % (127 - 33) + 1);
i++;
}
putc(10, stdout);
exit(0);
}
}
Ho successivamente testato, con la classica generazione del seme del codice precedente, quante volte potrebbe essere ripetuto lo stesso risultato per n esecuzioni, con la seguente stringa di comando:
- Codice: Seleziona tutto
$ for i in {0..300}; do echo -n "$i - "; ./file 30 ; done
La quale esegue il programma compilato con nome file 300 volte.
Il risultato è peggio di quello che mi aspettavo. Le stringhe non sono tutte diverse e viene generata una sequenza diversa ogni 100 esecuzioni circa.
Successivamente ho applicato questa modifica alla generazione del seme:
- Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>
#include <libgen.h>
#include <time.h>
int main(int argc, char *argv[])
{
if(argc != 2)
{
printf("\nusage: %s n\n", basename(argv[0]));
printf("where \'n\' is the string lenght\n\n");
exit(1);
}
else
{
int i = 0;
int N = atoi(argv[1]);
int *p = NULL;
unsigned n = (unsigned) &p;
srand(n);
while(i < N)
{
printf("%c", 32 + rand() % (127 - 33) + 1);
i++;
}
putc(10, stdout);
return 0;
}
}
Ho salvato il file come file2.c ed eseguendo n volte con il comando sopra riportato, si può osservare come il risultato ovviamente migliora nettamente.
Non so, magari è qualcosa che gli utenti che masticano il C da anni sapevano già da tempo, però io volevo farlo presente nel caso qualcuno volesse generare delle sequenze di numeri (e non) casuali in un lasso breve di tempo.
Se qualcuno conocesse metodi più casuali sarebbe interessante condividerli.

ma già me lo aspettavo.