logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[atmega8][c] Losowanie zadanej części populacji liczb

k_kudra 23 Cze 2011 23:05 1130 5
REKLAMA
  • #1 9644225
    k_kudra
    Poziom 11  
    Witam, stanąłem przed problemem skonstruowania urządzenia, które będzie w sposób losowy załączało wyjście, w dodatku zrobi to dla zadanego procentu losowań.

    Znalazłem na forum kilka rozwiązań problemu losowania, a właściwie wykorzystania jako seed dla funkcji losującej:
    - odczytywanie wartości na 'wolnym' wejściu
    - odczytywanie czasu wciśnięcia przycisku (tego nie mogę wykorzystać, ponieważ do uruchomienia losowania użyty będzie przekaźnik z innego urządzenia o stałym czasie przełączenia
    - dołożenie do układu zegara RTC



    Rozwiązanie problemu widzę tak: losuje liczbę, obliczam mod 2 i w zależności od wartości 0 lub 1 odpowiednio reaguje wyjściem.
    Nie mam natomiast pojęcia jak rozwiązać zrobić to tak, aby załączenie wyjścia nastąpiło maksymalnie dla np: 20% losowań.

    Może ktoś spotkał się z takim problemem i może coś podpowiedzieć?
    I która z metod uzyskania seed'a dla funkcji losującej byłaby lepsza? Może znacie jakieś inne?
  • REKLAMA
  • #2 9644360
    tmf
    VIP Zasłużony dla elektroda
    Odczyt pinu IO nie jest dobry, bo może być całkiem stabilny, nawet jeśli pin wisi. RTC jest lesze. Ale w procesorac AVR dobrym źródłem entropii jest ADC, można także (akurat nie w M8) wykorzystać szum termiczny diody mierzącej temp. procesora.
    Co do tych losowań to nie do końca łapię ideę. Czy prawdopodobieństwo zmiany stanu przy każdym losowaniu ma być takie samo, czy może rosnąć?
  • REKLAMA
  • #3 9644381
    k_kudra
    Poziom 11  
    Już tłumaczę - chodzi o to aby np na 100 losowań tylko 20 zakończyło się załączeniem wyjścia, ale to 20 występowało losowo wśród wszystkich 100 losowań.

    Trochę masło maślane ale mam nadzieję, że trochę rozjaśniło

    Dokładne zastosowanie układu jest następujące:
    układ będzie umieszczony pomiędzy czytnikiem kart zbliżeniowych a bramką obrotową. Losowani są pracownicy do rewizji. Po otrzymaniu impulsu z przekaźnika czytnika następuje losowanie. Jeśli wylosowano 0 - bramka jest otwierana (przekaźnik podłączony do wyjścia atmega) Jeśli wylosowano 1 - włączana jest syrena a bramka nie zostaje otwarta.
    Na dipswitchach ustawiane będzie jaki procent osób ma być sprawdzanych przez ochronę (10%, 20%)
  • REKLAMA
  • #4 9644416
    GSM
    Poziom 25  
    Witam,

    oj, podstawy się kłaniają... :roll:
    Losujesz liczbę z zakresu 0-99 (oczywiście rozkład jednostajny) i jeśli wylosowana liczba jest z zakresu 0-19 (mniejsza od 20) to masz swoje 20%.

    Pozdrawiam,
    GSM
  • REKLAMA
  • #5 9644419
    tmf
    VIP Zasłużony dla elektroda
    Ok, rozumiem, że chodzi tylko o statystykę. Zakładając, że masz odpowiedni generator liczb losowych, to jeśli jego przedział wyjściowy to 0-99, więc wartości 0-19 wypadną z 20% prawdopodobieństwem, oczywiście nie będzie tak, że na 100 próbek będziesz miał dokładnie 20 pozytywnych, ale w tym przypadku nie ma to znaczenia. A jeśli ma to można tak zrobić, żeby prawdopodobieństwo było pochodną dwóch czynników - losowego oraz wyliczonego na podstawie ilości pozostałych prób i ilości uzyskanych do tej pory wyników pozytywnych. Oczywiście wtedy prawdopodobieństwo wylosowania kolejnego pracownika nie jest stałe, ale za to np. na 100 losowań będziesz miał dokładnie zadaną ilość pozytywnych.
  • #6 9644421
    k_kudra
    Poziom 11  
    @GSM, rzeczywiście prościej się nie da :)

    @tmf - chodzi tylko o statystykę, nie musi być dokładnie tyle osób. Pozostaje tylko teraz stworzenie dobrego generatora. Spróbuję zrobić na ADC tak jak mówisz
REKLAMA