La libreria standard C++ 11 contiene una struttura decente e un paio di generatori utilizzabili, che sono perfettamente sufficienti per l'assegnazione dei compiti a casa e l'uso fuori dagli schemi.
Tuttavia, per il codice di livello di produzione è necessario conoscere esattamente quali sono le proprietà specifiche dei vari generatori prima di utilizzarli, poiché tutti hanno i loro avvertimenti. Inoltre, nessuno di questi supera i test standard per PRNG come TestU01, ad eccezione dei generatori di ranlux se usati con un generoso fattore di lusso.
Se si desidera ottenere risultati solidi e ripetibili, è necessario portare il proprio generatore.
Se si desidera la portabilità, è necessario portare il proprio generatore.
Se è possibile vivere con portabilità limitata, è possibile utilizzare boost o il framework C++ 11 in combinazione con i propri generatori.
Maggiori dettagli - compreso il codice per un generatore semplice ma veloce di ottima qualità e collegamenti copiose - può essere trovato nelle mie risposte ad argomenti simili:
Per deviazioni in virgola mobile uniforme professionale ci sono due ulteriori problemi da considerare:
- aperto vs. semiaperta vs intervallo chiuso, cioè (0,1), [0, 1) o [0,1]
- metodo di conversione da integrale a virgola mobile (precisione, velocità)
Entrambi sono in realtà due facce della stessa medaglia, come il metodo di conversione si occupa della inclusione/esclusione di 0 e 1. Qui sono tre metodi diversi per l'intervallo semiaperto:
// exact values computed with bc
#define POW2_M32 2.3283064365386962890625e-010
#define POW2_M64 5.421010862427522170037264004349e-020
double random_double_a()
{
double lo = random_uint32() * POW2_M64;
return lo + random_uint32() * POW2_M32;
}
double random_double_b()
{
return random_uint64() * POW2_M64;
}
double random_double_c()
{
return int64_t(random_uint64()) * POW2_M64 + 0.5;
}
(random_uint32()
e random_uint64()
sono segnaposto per le funzioni effettive e normalmente essere passati come parametri di modello)
Metodo un dimostra come creare un deviare uniforme che non viene sollecitato da eccesso di precisione per valori più bassi; il codice per 64-bit non viene mostrato perché è più semplice e richiede solo il mascheramento di 11 bit. La distribuzione è uniforme per tutte le funzioni, ma senza questo trucco ci sarebbero più valori diversi nell'area più vicina a 0 che altrove (una spaziatura più fine della griglia a causa dell'ulp variabile).
Metodo c mostra come ottenere una deviazione uniforme più veloce su alcune piattaforme popolari in cui la FPU conosce solo un tipo integrale a 64 bit con segno. Quello che vedi più spesso è il metodo b ma il compilatore deve generare molto codice extra sotto il cofano per preservare la semantica non firmata.
Combina e abbina questi principi per creare la tua soluzione personalizzata.
Tutto questo è spiegato nell'eccellente carta di Jürgen Doornik Conversion of High-Period Random Numbers to Floating Point.
nota, come la mia risposta indica la moderna C++ modo per farlo è usando l'intestazione 'random'. –