Vă mulțumim pentru susținere

Generarea de numere aleatoare generalizate

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?

0
adăugat editat
@ bames53 Am postat un vot de redeschidere acum. Se pare că ai destulă repetă, deci fă-o. :-D
adăugat autor Chris Jester-Young
De ce nu System.Random ? Știu că rand este slab, este System.Random sărac? Dacă da, asta e trist :(
adăugat autor Mooing Duck
Justificarea închiderii acestei întrebări nu pare a fi corectă.
adăugat autor bames53
Presupun că acum puteți pur și simplu google
adăugat autor Sergio

9 răspunsuri

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.

3
adăugat

Have a look at the CORDIC algorithms in section 31.2 of the fxtbook: http://www.jjj.de/fxt/

2
adăugat

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.

1
adăugat
Înțeleg Amos, îmi place de asemenea soluția dvs., însă multiplicarea ar trebui aleasă pe baza prezenței hardware-ului în mod normal, nu toate PIC-urile au multiplicatori hardware. În realitate, puteți utiliza o masă de căutare pentru grade și o aproximare liniară simplă de acolo și nu știți niciodată diferența dacă este atât de importantă.
adăugat autor Dan
În plus, dacă v-ați uitat la unghiuri cu o precizie de 1 grad, ați avea nevoie doar de valori în tabel. Toate celelalte pot fi derivate din unghiurile din primul cvadrant. Dacă faceți acest lucru pentru sine și cosinus, puteți obține valorile pentru tangenta dintre acestea ca: tan (theta) = sin (theta)/cos (theta). Ai nevoie de arcsin, arccos și arctan?
adăugat autor svec

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.

http://www.picbasic.co.uk/forum/showthread.php ? t = 10528

1
adăugat

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ă! :-)

0
adăugat

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.

0
adăugat

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).

#include

0
adăugat

Boost.Random is my first choice for RNG

http://www.boost.org/doc/libs/random

0
adăugat
Ai putea găsi Boost aleatoriu doar googling thats de ce i dint furniza orice link-uri. Acum l-am actualizat cu link-ul pentru lib.
adăugat autor Rohit Vipin Mathews

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

0
adăugat