eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming › Pojemnik na liczby losowe
Ilość wypowiedzi w tym wątku: 15

  • 1. Data: 2011-06-22 23:04:14
    Temat: Pojemnik na liczby losowe
    Od: Tubylerczyk <t...@d...pl>

    Jak inicjalizować generator pseudolosowy losową wartością? Jedną z
    możliwości jest odczyt zegara, ale tylko najmłodsze bity są losowe (jak
    określić - ile?). W Linuksie zdaje się, jest 512 bitowy pojemnik losowy
    utrzymywany przez system. Jak to zrobić w Windows? Problemem jest że
    bardzo powoli przybywa bitów. Zaledwie kilka na przerwanie, 160-bitowa
    liczba będzie wymagała wielu przerwań, a co jeśli chcemy wygenerować
    wiele takich liczb?


  • 2. Data: 2011-06-22 23:46:22
    Temat: Re: Pojemnik na liczby losowe
    Od: Michoo <m...@v...pl>

    W dniu 23.06.2011 01:04, Tubylerczyk pisze:
    > Jak inicjalizować generator pseudolosowy losową wartością?
    Byłoby łatwiej jakbyś określił do czego Ci to potrzebne.

    > Jedną z
    > możliwości jest odczyt zegara, ale tylko najmłodsze bity są losowe (jak
    > określić - ile?).
    Liczysz md5 z tej wartości i się nie przejmujesz tym ile.

    > 160-bitowa
    > liczba będzie wymagała wielu przerwań, a co jeśli chcemy wygenerować
    > wiele takich liczb?
    Od tego jest generator PSEUDOlosowy - on ma już pamięć i generuje
    kolejne wartości w oparciu o poprzednie - seed ustawia się raz.

    --
    Pozdrawiam
    Michoo


  • 3. Data: 2011-06-23 05:04:28
    Temat: Re: Pojemnik na liczby losowe
    Od: Tubylerczyk <t...@d...pl>

    W dniu 2011-06-23 01:46, Michoo pisze:
    > W dniu 23.06.2011 01:04, Tubylerczyk pisze:
    >> Jak inicjalizować generator pseudolosowy losową wartością?
    > Byłoby łatwiej jakbyś określił do czego Ci to potrzebne.

    (W jakiś sposób guid w systemie liczony jest tak, że mamy 128-bitową
    wartość losową, nie wiem na ile jest losowy)
    Na przykład: generuję losowe hasło dla użytkownika.

    >
    >> Jedną z
    >> możliwości jest odczyt zegara, ale tylko najmłodsze bity są losowe (jak
    >> określić - ile?).
    > Liczysz md5 z tej wartości i się nie przejmujesz tym ile.

    Ale losowa pozostaje tylko część tej liczby. Mówiąc obrazowo: mam 128
    bitową liczbę, ale tylko mały podzbiór jej wartości jest osiągalny.
    w skrajnym wypadku byłby jeden bit, policzenie md5 dałoby dwie duże
    liczby z których albo jedna albo druga by występowała.

    > Od tego jest generator PSEUDOlosowy - on ma już pamięć i generuje
    > kolejne wartości w oparciu o poprzednie - seed ustawia się raz.

    Przydałby się prawdziwie losowy generator wbudowany w procesor oparty o
    kwanty. Pojedyncza instrukcja dawałaby 64 bity szumu. Są jakieś
    zewnętrzne generatory które dołącza się przez USB ale nie są standardem,
    jest tez strona Random.org.



  • 4. Data: 2011-06-23 07:31:28
    Temat: Re: Pojemnik na liczby losowe
    Od: Mariusz Marszałkowski <m...@g...com>

    On Jun 23, 7:04 am, Tubylerczyk <t...@d...pl> wrote:

    > Przydałby się prawdziwie losowy generator wbudowany w procesor oparty o
    > kwanty. Pojedyncza instrukcja dawałaby 64 bity szumu. Są jakieś
    > zewnętrzne generatory które dołącza się przez USB ale nie są standardem,
    > jest tez strona Random.org.
    No ale do czego to potrzebujesz? Naprawde bardzo duzo mozna osiagnac
    bez kwantowego generatora liczb losowych. Ba, bardzo duzo mozna
    osiagnac na prostej funkcji rand C++ ktora (bez losowej inicjacji) za
    kazdym
    razem daje identyczny ciag liczb losowych. Wszystko zalezy od tego do
    czego
    to potrzebujesz.
    Pozdrawiam



  • 5. Data: 2011-06-23 10:50:35
    Temat: Re: Pojemnik na liczby losowe
    Od: Michoo <m...@v...pl>

    W dniu 23.06.2011 07:04, Tubylerczyk pisze:
    > W dniu 2011-06-23 01:46, Michoo pisze:
    >> W dniu 23.06.2011 01:04, Tubylerczyk pisze:
    >>> Jak inicjalizować generator pseudolosowy losową wartością?
    >> Byłoby łatwiej jakbyś określił do czego Ci to potrzebne.
    >
    > (W jakiś sposób guid w systemie liczony jest tak, że mamy 128-bitową
    > wartość losową, nie wiem na ile jest losowy)
    On ma być unikalny a nie losowy. Oidp jakaś implementacja używała
    fragmentu MAC i czasu jako części składowych.

    > Na przykład: generuję losowe hasło dla użytkownika.
    Oidp sam wynik MD5 jest dość dobrym ciągiem losowym.

    Jeżeli dokładny czas jest nieznany "na zewnątrz". (Np użycie licznika
    cykli z performance counters) to dla potrzeb wygenerowania hasła
    wystarczy (każda sekunda to 10^9 możliwości).

    Zapewnia to po pierwsze losowy rozkład wyjścia a po drugie praktyczną
    niemożliwość prognozowania hasła na podstawie nawet wielu znanych. A to
    chyba główne 2 zadania do których losowość jest tu potrzebna.

    >
    >>
    >>> Jedną z
    >>> możliwości jest odczyt zegara, ale tylko najmłodsze bity są losowe (jak
    >>> określić - ile?).
    >> Liczysz md5 z tej wartości i się nie przejmujesz tym ile.
    >
    > Ale losowa pozostaje tylko część tej liczby. Mówiąc obrazowo: mam 128
    > bitową liczbę, ale tylko mały podzbiór jej wartości jest osiągalny.
    > w skrajnym wypadku byłby jeden bit, policzenie md5 dałoby dwie duże
    > liczby z których albo jedna albo druga by występowała.
    Tylko czas ma taką niewiarygodną własność, że jest monotoniczny a nie 2
    wartościowy.

    MD5 (czy SHA - do wyboru) daje wyjście spełniające dość dobrze kryteria
    ciągu losowego.

    W efekcie mamy funkcję przyporządkowującą dla danego T n-bitową wartość
    losową[*]. To, że ciąg z którego bierzemy T nie jest losowy nie ma
    praktycznego znaczenia, bo używana funkcja nie posiada funkcji odwrotnej.

    [*] ściśle mówiąc pseudolosową - przeciwdziedzina funkcji skrótu jest
    zawsze ograniczona, czas również (do słowa 64/128b), ale są to wartości
    dostatecznie duże

    >
    >> Od tego jest generator PSEUDOlosowy - on ma już pamięć i generuje
    >> kolejne wartości w oparciu o poprzednie - seed ustawia się raz.
    >
    > Przydałby się prawdziwie losowy generator wbudowany w procesor oparty o
    > kwanty.
    Są generatory oparte o szumy termiczne. Stosuje się je tam gdzie to jest
    konieczne. W komputerach domowych raczej nie jest. No i łatwiej się
    poprawia ewentualne błędy w programach niż w krzemie.

    --
    Pozdrawiam
    Michoo


  • 6. Data: 2011-06-23 13:20:11
    Temat: Re: Pojemnik na liczby losowe
    Od: bartekltg <b...@o...pl>

    W dniu 2011-06-23 01:04, Tubylerczyk pisze:
    > Jak inicjalizować generator pseudolosowy losową wartością? Jedną z
    > możliwości jest odczyt zegara, ale tylko najmłodsze bity są losowe (jak
    > określić - ile?). W Linuksie zdaje się, jest 512 bitowy pojemnik losowy

    Wszystkie. Przecież nie korzystasz z wartości [czas], tylko
    (w uproszczeniu) z r_1 = F(czas) [a dalej r_n = F (r_{n-1})]
    Jeśli czasy różnią się choć jednym bitem, to pierwsza liczba
    pseudolosowa r_1 bdyie w obu przypadkach zupełnie różna.

    Pamiętaj, że w programie raz się inicjalizuje tą zmienną,
    najczęściej nie trzeba więc wysokiej rozdzielczośći czau,
    chyba , że programy są często odpalane i krótkie
    (to czemu tego nie wrzucić w jeden program w pętle;)

    BTW, ostatnio ktoś tu, albo na p.c.l.c pisał o tym, że
    korzysta z zegara i numeru wątku/procesu, aby wielowątkowo
    puszczony program nie szedł tą samą ścieżką.

    > utrzymywany przez system. Jak to zrobić w Windows? Problemem jest że
    > bardzo powoli przybywa bitów. Zaledwie kilka na przerwanie, 160-bitowa
    > liczba będzie wymagała wielu przerwań, a co jeśli chcemy wygenerować
    > wiele takich liczb?

    Użyj tych prawdziwych liczb losowych do inicjalizowania
    generatora pseudolosowych. Jeśli nie szyfrujesz kanału
    Klewki-Baza CIA będzie dobrze. A inicjalozowanie jest
    bardzo rzadkie (raz na program).

    pozdrawiam
    bartekltg



  • 7. Data: 2011-06-23 15:02:37
    Temat: Re: Pojemnik na liczby losowe
    Od: Tubylerczyk <t...@d...pl>

    W dniu 2011-06-23 15:20, bartekltg pisze:
    > W dniu 2011-06-23 01:04, Tubylerczyk pisze:
    >> Jak inicjalizować generator pseudolosowy losową wartością? Jedną z
    >> możliwości jest odczyt zegara, ale tylko najmłodsze bity są losowe (jak
    >> określić - ile?). W Linuksie zdaje się, jest 512 bitowy pojemnik losowy
    >
    > Wszystkie. Przecież nie korzystasz z wartości [czas], tylko
    > (w uproszczeniu) z r_1 = F(czas) [a dalej r_n = F (r_{n-1})]
    > Jeśli czasy różnią się choć jednym bitem, to pierwsza liczba
    > pseudolosowa r_1 bdyie w obu przypadkach zupełnie różna.

    Owszem, jeśli chodzi o inicjalizację zmiennej a potem używa wartości
    pseudolosowych. Wtedy wystarczy jeden bit różnicy, podczas gdy skrót MD5
    czy SHA będą różniły się całkowicie.
    Ale weźmy czas w formacie Unixa zmieniający się co sekundę. Można
    powiedzieć że źle będzie tylko wówczas gdy wykonamy program dwa razy w
    ciągu tej samej sekundy, a gdy o jedną sekundę później to już dobrze.
    Jednak co co się stanie, gdy ktoś zna funkcję haszującą i wartość
    pierwszej chwili czasowej? Będziemy mieli 32 bity czasu, >130 lat ale
    tylko najmłodsze bity będą się różniły. Nawet te najmłodsze nie będą
    losowe, bo wiadomo że przy drugim odpaleniu będą miały wartość większą a
    nie mniejszą.
    Losowość rozumiem w ten sposób, że wciskam klawisz i za sekundę wciskam,
    sterownik oblicza między nimi ilość taktów procesora, to czy ta ilość
    jest parzysta czy nie jest czysto losową zmienną, również starsze bity,
    tak aż do pół sekundy, ten półsekundowy bit nie będzie tak już w pełni
    losowy, a starsze będą zerowe więc wcale nie losowe.


  • 8. Data: 2011-06-24 07:09:01
    Temat: Re: Pojemnik na liczby losowe
    Od: Mariusz Marszałkowski <m...@g...com>

    On Jun 23, 5:02 pm, Tubylerczyk <t...@d...pl> wrote:
    > Ale weźmy czas w formacie Unixa zmieniający się co sekundę. Można
    > powiedzieć że źle będzie tylko wówczas gdy wykonamy program dwa razy w
    > ciągu tej samej sekundy, a gdy o jedną sekundę później to już dobrze.
    > Jednak co co się stanie, gdy ktoś zna funkcję haszującą i wartość

    srand( wszystko_co_ci_przyjdzie_do_glowy );
    time_t s = time(NULL) + 2;
    while( s > time(NULL) )
    rand();
    return rand();

    Mocno obciaza procesor, ale teraz by musial znac duzo dokladniej
    czas uruchomienia (no i to co przyszlo Ci do glowy )
    Pozdrawiam


  • 9. Data: 2011-06-24 12:57:41
    Temat: Re: Pojemnik na liczby losowe
    Od: "b...@n...pl" <b...@n...pl>

    On 23.06.2011 17:02, Tubylerczyk wrote:
    > W dniu 2011-06-23 15:20, bartekltg pisze:
    >> W dniu 2011-06-23 01:04, Tubylerczyk pisze:
    >>> Jak inicjalizować generator pseudolosowy losową wartością? Jedną z
    >>> możliwości jest odczyt zegara, ale tylko najmłodsze bity są losowe (jak
    >>> określić - ile?). W Linuksie zdaje się, jest 512 bitowy pojemnik losowy
    >>
    >> Wszystkie. Przecież nie korzystasz z wartości [czas], tylko
    >> (w uproszczeniu) z r_1 = F(czas) [a dalej r_n = F (r_{n-1})]
    >> Jeśli czasy różnią się choć jednym bitem, to pierwsza liczba
    >> pseudolosowa r_1 bdyie w obu przypadkach zupełnie różna.
    >
    > Owszem, jeśli chodzi o inicjalizację zmiennej a potem używa wartości
    > pseudolosowych. Wtedy wystarczy jeden bit różnicy, podczas gdy skrót MD5
    > czy SHA będą różniły się całkowicie.
    > Ale weźmy czas w formacie Unixa zmieniający się co sekundę. Można
    > powiedzieć że źle będzie tylko wówczas gdy wykonamy program dwa razy w
    > ciągu tej samej sekundy, a gdy o jedną sekundę później to już dobrze.
    > Jednak co co się stanie, gdy ktoś zna funkcję haszującą i wartość
    > pierwszej chwili czasowej? Będziemy mieli 32 bity czasu, >130 lat ale
    > tylko najmłodsze bity będą się różniły. Nawet te najmłodsze nie będą
    > losowe, bo wiadomo że przy drugim odpaleniu będą miały wartość większą a
    > nie mniejszą.
    > Losowość rozumiem w ten sposób, że wciskam klawisz i za sekundę wciskam,
    > sterownik oblicza między nimi ilość taktów procesora, to czy ta ilość
    > jest parzysta czy nie jest czysto losową zmienną, również starsze bity,
    > tak aż do pół sekundy, ten półsekundowy bit nie będzie tak już w pełni
    > losowy, a starsze będą zerowe więc wcale nie losowe.

    Weź kartę radiową, nastaw na nieużywany kanał, nie na stację. Masz
    losowy szum na wejściu.

    Możesz skorzystać też np z licznika bajtów na interfejsie sieciowym,
    stanów rejestrów, pobrać jakiś stan z dysku, można próbować pogadać z
    kartą graficzną. Możliwości jest naprawdę dużo.

    --
    wer <",,)~~
    http://szumofob.eu


  • 10. Data: 2011-06-24 16:19:30
    Temat: Re: Pojemnik na liczby losowe
    Od: Tubylerczyk <t...@d...pl>

    W dniu 2011-06-24 09:09, Mariusz Marszałkowski pisze:
    > srand( wszystko_co_ci_przyjdzie_do_glowy );
    > time_t s = time(NULL) + 2;
    > while( s> time(NULL) )
    > rand();
    > return rand();

    Ja to rozwiązałem w ten sposób:
    Podczepić hooka pod zdarzenia przycisku klawiatury. W przypadku
    uderzenia klawisza odczytujemy czas - ilość taktów zegara CPU za pomocą
    rdtsc. Wyliczamy odstępy między kolejnymi uderzeniami - liczba dodatnia
    (aby nie było problemów, program musi działać tylko na jednym rdzeniu
    SetProcessAffinityMask(GetCurrentProcess(), 1) bo inaczej raz odczyta z
    jednego licznika a raz z drugiego).
    Sam odstęp jeszcze nie mówi ile bitów losowych da się z niego uzyskać,
    autorepeat klawisza daje niemal identyczne czasy i mało w nim bitów
    losowych. Potrzebna jest różnica, o ile zmienił się odstęp - im większa,
    tym więcej bitów losowych. Wyliczyć ile bitów - z wartości bezwzględnej
    policzyć indeks najstarszego zapalonego bitu + 1.
    Bitami losowymi będą najmłodsze bity ostatniego czasu. Nie da się
    wykorzystać znaku różnicy odstępów ponieważ ma rozkład nie losowy.
    Typowe bębnienie po klawiaturze dawało strumień rzędu 800 bitów/s.

strony : [ 1 ] . 2


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: