Domanda

sto usando srandom () e random () per generare numeri casuali in c su un sistema Unix. Mi piacerebbe avere più RNG. Ciascuno, a parità di seme, dovrebbe produrre la stessa sequenza. Vorrei anche per salvare e ripristinare lo stato di ciascuno di essi. Ecco un esempio pseudocodice:

R1 = new_rng(5); //5 is the seed
R2 = new rng(5); //5 is the seed here, too.
a = R1.random();
b = R1.random();
d = R2.random(); //a == d
s1 = R2.get_state(); //save the state of R2
e = R2.random(); //b == e
R2.set_state(s1); //restore the state of R2
f = R2.random(); //b == f

Come posso fare questo? Talvolta RNG devierà in diverse filettature e devo replicare lo stato del RNG quando si crea un nuovo thread, anche.

È stato utile?

Soluzione

erand48() / nrand48() / jrand48() per generare doppio punto precisione floating, lungo intero non negativo, o firmati numeri casuali intere lunghe, rispettivamente. Queste funzioni consentono di avere il maggior numero di sequenze indipendenti come desiderato; lo Stato è passato come un argomento e può essere facilmente salvati e ripristinati. Inoltre, la sequenza è definita dallo standard e non varierà attraverso i funzionamenti, anche su piattaforme diverse.

Alcune altre risposte suggeriscono rand_r() . Questa funzione è obsoleta in POSIX.1-2008, che contiene questa nota:

  

La funzione drand48() fornisce un generatore di numeri casuali molto più elaborato.

     

Le limitazioni sulla quantità di stato che può essere effettuata tra una chiamata di funzione e un'altra significano la funzione <=> può mai essere attuato in modo che soddisfi tutti i requisiti per un generatore di numeri pseudo-casuali. Pertanto questa funzione dovrebbe essere evitato quando devono essere soddisfatti requisiti non banali (compresa la sicurezza).

     

La funzione <=> può essere rimosso in una versione futura.

Altri suggerimenti

questo articolo sul Mersenne Twister . Ci sono collegamenti a diverse implementazioni in fondo. (In altre parole, implementare un PRNG da soli.)

ci sono alcuni estensione libreria C su vari gusti UNIX:

  • BSD come casuale, controllare initstate / setstate
  • varianti _R (random_r, srandom_r, initstate_r, ecc)
  • rand_r (stdlib.h)

che il sapore è supportato dal vostro target di UNIX?

Utilizzare rand_r(unsigned *seed) invece di srand() e rand(). In questo modo è possibile mantenere più semi casuale.

Non sono sicuro che si può fare affidamento sulla vostra PRNG per produrre la stessa identica sequenza dato un seme identica realtà. So che alcuni metodi funzionano in questo modo, ma ritengo che alcuni dei migliori includono una certa quantità di non-determinismo, in modo che un seme identico può portare ad una sequenza diversa. Dovrete passare attraverso la documentazione libc con un pettine a denti fini e vedere se questo è menzionato da qualche parte. In caso contrario, controllare il codice (se siete così fortunati ad avere accesso al codice).

In ogni caso, questa coppia volontà vostra applicazione molto strettamente infatti alla realizzazione PRNG nel libc. Avrete sicuramente vincolato al sapore di libc si sta sviluppando, e forse anche la versione libc. Se questa caratteristica è molto importante, potrebbe essere necessario reimplementare generazione di numeri casuali nella tua app per garantire la portabilità e la riproducibilità.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top