• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Ta sama liczba pseudolosowa w różnych językach programowania.

Aruba Cloud PRO i VPS, Openstack, VMWare, MS Hyper-V
+2 głosów
164 wizyt
pytanie zadane 18 lipca 2021 w Inne języki przez kubekszklany Gaduła (3,120 p.)

Witam. Czy istnieje taki skrypt, dzięki któremu, po wprowadzeniu seed otrzymam liczbę pseudolosową, który w różnych językach programowania i na różnych systemach operacyjnych daje ten sam wynik? Przykładowo skrypt Random rand1 = new Random(12345); Console.WriteLine(rand1.Next()); w c# daje wynik 143337951, a skrypt Random rand1 = new Random(12345); System.out.println(rand1.nextInt()); w java daje wynik 1553932502. Jest więc jakaś biblioteka albo algorytm czy pseudokod, dzięki któremu uzyskam te same liczby w różnych językach programowania?

komentarz 18 lipca 2021 przez Wiciorny Ekspert (256,490 p.)
może warto by troszke posiedzieć i zaglądnąć do wnętrza funkcji :) NEXT() oraz dla javy nextINT() - bo mają zapewne inna implementacje odcięcia i "zaokrąglenia"
Dodatkowo :) napisać możesz własną funkcje która to robi dla 2 języków w jednakowy sposób

1 odpowiedź

+2 głosów
odpowiedź 18 lipca 2021 przez edutomek Dyskutant (8,380 p.)
Może istnieje - warto poszukać. Ale trzeba też odpowiedzieć sobie na istotne pytania:
- do czego to jest potrzebne?
- jakie będą konsekwencje, jeśli wygenerowane sekwencje wartości pseudolosowych w pewnym momencie zaczną się różnić?
- jakie konkretnie języki/platformy/architektury są potrzebne? (bo na pewno wszystkie)

Bo jeśli mowa o Javie i C#, to obstawiam, że można byłoby porównać rozmiary typów liczb (np. czy i tu i tu są używane 32-bitowe, a może 64-bitowe) i jeśli byłyby takie same, to może implementacja tego samego algorytmu rozwiązałaby problem?

Rzecz w tym, że liczby pseudolosowe mogą być generowane przez różne generatory (algorytmy) liczb pseudolosowych (PRNG, od ang. Pseudo-Random Number Generator). Zazwyczaj w każdym języku jest dostępny >>jakiś<< PRNG, lecz wątpię, aby były to te same warianty tego samego algorytmu. Najprościej się o tym przekonać generując sekwencję, powiedzmy, dziesięciu liczb pseudolosowych, w dwóch różnych językach, inicjalizując PRNG tą samą wartością.

Zresztą, o czym tu mówić - w takim JavaScript w ogóle nie ma możliwości ustawiania ziarna losowego. (No, chyba że w ostatnich latach coś się zmieniło, a ja to przegapiłem.)

Też miałem kiedyś taki problem - chciałem uzyskać tą samą sekwencję liczb pseudolosowych w różnych językach. Nie było to łatwe. Powód? PRNGi działają na zasadzie wykonywania różnych operacji na wartościach - operacji arytmetycznych, operacji na bitach (przesunięcia, działania logiczne). Implementacja takiego np. Mersenne Twistera bazuje chyba na liczbach o określonym rozmiarze (nie pamiętam już - 32 bity, czy 64 bity?). Nie zawsze takie właśnie liczby są dostępne we WSZYSTKICH językach. Moje próby "rozbiły" się o różnice, jakie pojawiały się w operacjach wykonywanych podczas implementacji wspomnianego MT.

(Zresztą problem może być jeszcze trudniejszy: głowy sobie za to uciąć nie dam, ale coś mi się kojarzy, że niektóre języki mogą generować inny kod na architekturach 32-bitowych, a inny na 64-bitowych. No to powodzenia z takimi implementacjami PRNG...)

Problem ostatecznie rozwiązałem pewnym obejściem: generując w jednym z języków sekwencję liczb pseudolosowych, która była wczytywana w drugim języku. Mało eleganckie, ale działało. (A że nie o to chodziło w projekcie, to pomysł ostatecznie porzuciłem.)

Może dałoby się to rozwiązać, gdybym opracował lepszą implementację MT. A może potrzebny byłby inny algorytm PRNG? W każdym razie temat jest interesujący.

Dodam, że najtrudniej byłoby w praktyce sprawdzić, czy dwie implementacje tego samego algorytmu działają identycznie. Każdy PRNG cechuje się pewnym cyklem - tzn. po pewnym czasie liczby pseudolosowe zaczynają się powtarzać. Im dłuższy cykl, tym, lepszy PRNG. Życzę powodzenia w sprawdzaniu, czy powtarza się CAŁA sekwencja wygenerowanych liczb pseudolosowych... Bo w zasadzie wystarczy jedna różnica, która kiedyś-tam się pojawi, aby obydwie implementacje nie były sobie równoważne... A cykle są dość długie (krótkie byłyby mało przydatne).

Dodam jeszcze, że swego czasu w takim Pythonie pojawił się ciekawy problem. Otóż implementacja PRNG została w pewnym momencie zmieniona. Tzn. w wersji X Pythona był stosowany inny PRNG, niż w wersji Y. I człowiek musiał implementować własny algorytm, żeby wyniki były potarzalne... (W zasadzie to nie trzeba było implementować, wystarczyło znaleźć gotową implementację w sieci.)

Podobne pytania

0 głosów
1 odpowiedź 227 wizyt
pytanie zadane 15 października 2017 w Java przez Dawidos01111 Nowicjusz (160 p.)
0 głosów
2 odpowiedzi 133 wizyt
pytanie zadane 29 lutego 2016 w C i C++ przez niezalogowany
0 głosów
1 odpowiedź 142 wizyt
pytanie zadane 20 października 2015 w Inne języki przez Krzysztof Rampa Nowicjusz (190 p.)

91,276 zapytań

139,941 odpowiedzi

315,128 komentarzy

60,722 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...