2013-11-26 7 views
5

Biorąc pod uwagę to samo nasienie, czy System.Random firmy Haskell da mi takie same wyniki dla wszystkich systemów, architektur procesorów i wersji Haskella? Czy istnieje obietnica, że ​​to będzie obowiązywać w przyszłości?Czy mogę oczekiwać, że wyniki przy użyciu System.Random będą odtwarzalne na wszystkich systemach?

Dokładniej mogę oczekiwać, że to zawsze (przeszłe i przyszłe) zwróci tę samą listę?

import System.Random 
rs = randomRs (1, 2^31-1) (mkStdGen 1) 
+4

Jestem prawie pewna, że ​​żadna obietnica nie została sformułowana w żadnym miejscu i nie byłoby też dobrego powodu. Jeśli chcesz odtwarzalny łańcuch, dlaczego nie rzucasz własnym PRNG? Wydaje się rozsądne, aby mieć to lokalne, jeśli w zasadzie używasz go jako stałej nieskończonej listy. Możesz nawet uczynić go instancją 'RandomGen', więc może być inaczej użyty w taki sam sposób jak narzędzia' System.Random'. – leftaroundabout

+2

@leftaroundabout Mogę wymyślić wiele dobrych powodów, aby zagwarantować spójne losowe strumienie; również dyskusja tutaj jest istotna: http://blog.ezyang.com/2011/05/haskell-not-pure-enough/ – jberryman

+1

O ile dokumentacja nie mówi, że tak jest, prawdopodobnie tak nie jest. Zwłaszcza w przypadku bardzo dużych liczb lub małych liczb (lub liczb rzeczywistych z dużą dokładnością), w których różne systemy zaokrąglają w różny sposób. Prawdopodobnie jest to możliwe, ale trzeba by było zaprogramować go z najwyższą ostrożnością i prawdopodobnie użyłby wyspecjalizowanych typów liczb zaprojektowanych tak, aby nie utraciły danych. Nie jestem jednak ekspertem od obliczeń naukowych czy generatorów liczb losowych. – AlexMA

Odpowiedz

0

Generatory liczb pseudolosowych są deterministyczne w odniesieniu do wartości, którą są "obsiewane". Dlatego mkStdGen jest czystą funkcją. Jeśli naprawdę się martwisz, tak, najlepiej nie polegać na niezmiennikach, które nie są częścią specyfikacji biblioteki. Praktycznie chciałbym pokazać, że w tym przypadku pseudolosowość nie ma z tym nic wspólnego - problem ogranicza się do tego, czy czysty Haskell bez typów specyficznych dla maszyny ocenia to samo na różnych platformach.

StdGen to obecnie realizowane z Int32s. Oczywiście z tych stałych liczb całkowitych można próbkować inne typy danych, ale generator liczb losowych używa tylko typów danych niezależnych od maszyny. Zgodnie ze źródłem klasy Integer zaokrąglanie również nie jest dodawane do maszyny (tak jest również w przypadku typów liczb całkowitych C). Z fixnums, w przeciwieństwie do flonums, nie ma zarówno mniej przekonujące korzyści wydajności z łamania standardów, i znacznie większe ryzyko poprawności programu.

Szczególnie w przypadku StdGen silna kryptografia wymaga silnego standardu pseudolosowości - niezamierzone zachowanie specyficzne dla architektury prawdopodobnie stanowiłoby istotną całość bezpieczeństwa, podczas gdy zamierzone zachowanie specyficzne dla architektury zasadniczo oznacza pisanie, utrzymywanie i udowodnienie poprawności wielu generatorów. Jeśli dodatkowy wysiłek jest tego wart, prawdopodobnie warto go reklamować/dokumentować.

Wreszcie, na hakcie istnieje wiele pseudolosowych generatorów liczb (System.Random nie powinien być najszybszym lub bezpieczniejszym AFIAK) i byłbym zdziwiony, gdyby jeden z celowanych zastosowań kryptograficznych nie oferował niezmienników, których potrzebujesz .

+0

Jeśli na świecie istnieje więcej niż jeden bezpieczny PRNG, specyficzne dla systemu PRNG nie są lukami w zabezpieczeniach. – misterbee

+0

Dobra uwaga, mam nadzieję, że teraz jest jaśniej – Sonarpulse

Powiązane problemy