[Tech] random

Franco Bagnoli bagnoli@dma.unifi.it
Gio 15 Feb 2001 13:39:00 CET


On Wed, 14 Feb 2001, Leonardo Boselli wrote:

> Mi servono delle stringhe random.
> Il programma e` in :-( perl ....
> La prima cosa che mi e`venuta in mente e` leggere 7 byte da 
> /dev/random e usare il risultato di tale oggetto ... ma se ci faccio 
> pių chiamate riesco a generare un numero casuale solo una volta 
> ogni 3-4 secondi.
> C'č un altro metodo, pių veloce (tipo prendere 2 byte solo e 
> combinarli col PID  ????)

guardiamo se ho capito: tu vuoi generare queste stringhe random da un 
programa non persistente, ovvero lo fai partire, ti genera una
stringa ed esce, e lo vuoi lanciare piu' spesso di una volta ogni tre
secondi? 

Perche' se il programma deve generare piu' di una stringa alla volta basta
usare rand, eventualmente inizializzandolo con /dev/random, e non ci sono
problemi di velocita' (oltre ad essere piu' leggero per il sistema, che
non deve ricaricare perl ogni volta).

Nel primo caso (e supponendo che tu non voglia rendere persistente il
programma, per esempio usando mod_perl) puoi: 

1) salvare lo stato del generatore di numeri random del perl su un file,
ed usarlo per reinizializzare il generatore (eventualmente ogni tanto puoi
rimescolarlo con /dev/random) 

2) scrivere un programmetto che faccia da server random piu' veloce di
/dev/random e farlo girare sempre (per esempio usando un fifo), ecco 
un esempio preso da perlipc

------------------------------------------------------------------
#!/usr/bin/perl

@my_letters=(a..z,A..Z,0..9);
$len=7;

 chdir; # go home
 $FIFO = '.rand';
 
 while (1) {
     unless (-p $FIFO) {
         unlink $FIFO;
         system('mknod', $FIFO, 'p')
             && die "can't mknod $FIFO: $!";
     }

     # next line blocks until there's a reader
     open (FIFO, "> $FIFO") || die "can't write $FIFO: $!";
		 $a = "";
                 # just to avoid "for($i=0; $i<$len; $i++)"
		 map $a .= $my_letters[rand(@my_letters)], 1..$len; 
     print FIFO $a;
     close FIFO;
     sleep 1;    # to avoid dup signals
 }
----------------------------------------------------------------

non so pero' se riesci a farlo girare abbastanza veloce
(prova a levare lo sleep e vedrai....) 

(rand del perl e' inizializzato con /dev/urandom + qualche altra cosa...)

-- 
Franco Bagnoli
Dipartimento di Matematica Applicata "G. Sansone"
Universita' di Firenze, Via S. Marta, 3 I-50139 Firenze, Italy
tel. +39 0554796422, fax: +39 055471787
e-mail: bagnoli@dma.unifi.it





Maggiori informazioni sulla lista flug-tech