Caut un RNG performant, robust, rezonabil, fără hardware special. Poate folosi metode matematice (Mersenne Twister, etc), poate "colecta entropia" din mașină, indiferent. Pe Linux / etc avem un drand48 ()
care generează 48 de biți aleatorii. Aș dori o funcție / clasă similară pentru C ++ sau C #, care poate genera mai mult de 32 de biți de aleatorie și care biți de ordin mic sunt la fel de aleatorii ca biții de înaltă ordine.
Nu trebuie să fie sigur din punct de vedere criptografic, dar nu trebuie să utilizeze sau să se bazeze pe limbajul C rand ()
sau .NET System.Random
.
Orice cod sursă, link-uri la sursă etc. ar fi apreciat! În lipsă, ce tip de RNG ar trebui să caut?
Acest subiect a fost discutat pe larg pe StackOverflow, este destul de independent de procesor și independent de limbă, cu excepția costurilor relative ale multiplicării/adăugării/căutării, ceea ce va face anumite implementări mai atractive.
Funcția atan2 (), sau conversia dreptunghiulară-polară, nu este complet implementabilă de către tabelele de căutare de dimensiuni rezonabile; CORDIC este o opțiune.
Have a look at the CORDIC algorithms in section 31.2 of the fxtbook: http://www.jjj.de/fxt/
Sunteți de codificare pe un PIC, câte biți este unghiul dvs.? Dacă aveți un număr de 8 biți care vine, o masă de căutare în sus poate fi ușor, dacă aveți un număr de 16 biți vine, atunci este o poveste diferită.
În mod normal, în PIC numărul de 8 sau 10 biți este la fel de mare ca și cum veți obține, o masă de căutare sus este, probabil, în regulă. Oamenii se pierd adesea în obținerea unui număr mare de precizie, de obicei nu aveți nevoie de unul. Am avut pe cineva care citea un număr de 12 biți dintr-un senzor, folosind dublurile și obținând o conversie cu adevărat precisă. Acesta a funcționat perfect atunci când a folosit o sursă de tensiune ca o intrare pentru testare, dar adăugați un senzor real cu eroarea lui și veți găsi toată precizia este o pierdere de timp.
Există cazuri în care aș sugera folosirea unei funcții sin/cos/tan de înaltă calitate, nu am întâlnit niciodată unul pe un PIC. Iartă-mă dacă ai nevoie de o funcție de semn de înaltă calitate, eu răspund doar la ceea ce ar fi răspunsul potrivit pentru 95% din cazuri.
Un pic tarziu, dar aici este o solutie PicBasic Pro pentru functiile Trig. Acesta utilizează un ansamblu Cordic include fișier pentru calcule rapide. Dă rezultatul Sin (x) și Cos (x) sau rezultatul atan2 (x, y) cu o precizie de aproximativ 16 biți.
Pentru C ++, Boost.Random este probabil ceea ce căutați. Are suport pentru MT (printre mulți alți algoritmi) și poate colecta entropia prin clasa nondet_random
. Verifică! :-)
The Gnu Scientific Library (GSL) has a pretty extensive set of RN generators, test harness, etc. If you're on linux, it's probably already available on your system.
Fiți atenți la Biblioteca Științifică Gnu. Este licențiat sub GPL mai degrabă decât LGPL.
După cum au menționat alte persoane, clasele aleatoare Boost sunt un început bun. Implementarea lor este conformă cu codul PRNG plătit pentru TR1:
http://www.boost.org/doc/libs/1_35_0/libs/random/index.html http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1452.html
Dacă aveți o versiune recentă a compilatorului G ++, puteți găsi bibliotecile TR1 deja incluse
Boost.Random
is my first choice for RNG
C ++ 11 a adoptat o bibliotecă robustă de numere aleatorii bazată pe boost.random. Puteți accesa un număr de motoare cu numere aleatorii utilizând algoritmi diferiți pentru a vă satisface cerințele de calitate, viteză sau dimensiune. Implementările de calitate vor oferi chiar acces la orice RNG non-determinist pe care platforma dvs. îl oferă prin std :: random_device
.
În plus, există multe adaptoare pentru a produce distribuții specifice, eliminând necesitatea de a face o astfel de manipulare manuală (ceva ce se întâmplă adesea incorect).