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

VPS Starter Arubacloud
+2 głosów
326 wizyt
pytanie zadane 18 lipca 2021 w Inne języki przez kubekszklany Gaduła (3,170 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 (269,120 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ź 261 wizyt
pytanie zadane 15 października 2017 w Java przez Dawidos01111 Nowicjusz (160 p.)
0 głosów
2 odpowiedzi 152 wizyt
pytanie zadane 29 lutego 2016 w C i C++ przez niezalogowany
0 głosów
1 odpowiedź 203 wizyt
pytanie zadane 20 października 2015 w Inne języki przez Krzysztof Rampa Nowicjusz (190 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...