Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Kod permutujący wartości w zmiennej tablicowej

Wojtek001 25 Lut 2012 20:21 842 6
  • #1 25 Lut 2012 20:21
    Wojtek001
    Poziom 15  

    Witam. Napisałem sobie poniższy kod w BASCOMIE. Ma on za zadanie przemieszać wartości w zmiennej tablicowej tablica.
    Np. mam zmienną
    Tablica:
    Data 1,2,3,4,5,6,7,8
    i po kilkukrotnym naciśnięciu przycisków (napisałem kilkukrotnym bo kod jest tak napisany że jedno naciśnięcie powoduje zamianę tylko jednej pary liczb ,a więc żeby dobrze przemieszać wartości to trzeba wiele razy naciskać).
    Otrzymuję np. coś takiego
    Tablica:
    Data 2,8,4,1,3,5,7,6

    Ogólnie chodzi o to żeby wartości się pomieszały.
    Więc proszę sprawdzić poniższy algorytm i ewentualne błędy wytknąć mi w odpowiedziach (szczególnie czy dobrze zadeklarowałem zmienną tablicową tablica i czy dane do tej zmiennej mają być na początku programu czy na końcu):D ?
    Czy przy podawaniu danych to zmiennej Tabela mam napisac ilość komórek czyli
    Czy tak:

    Tabela:
    Data 1,2,3,4,5,6,7,8

    czy tak
    Tabela(8):
    Data 1,2,3,4,5,6,7,8

    :?:

    Jakby co to spoczynkowy stan Portd będzie miał równy 255 a naciśnięcie któregoś z przycisku zewrze jeden z pinów tego portu do masy więc wymusi to stan logiczy 0 przez co cała wartość portu bedzie mniejsza od 255. A co do Portu a to 4 najmłodsze bity będą miały stan spoczynkowy 1 i też będą podpięte do przycisków .
    Dlatego napisałem linikę: "If Pind < 255 OR Pina < 15 Then "

    A oto kod do sprawdzenia:

    Code:
    Tabela:                                'tutaj wpisuje wartości do zmiennej tablicowej
    
    Data 1,2,3,4,5,6,7,8

    'tutaj wszystkie konfiguracje portów itp.

    Dim Tabela(8) As Byte                  'tutaj zadeklarowałem zmienną tablicową
    'tutaj zadeklarowanie innych zmiennych których uzyłem

    Do
    If Pind < 255 OR Pina < 15 Then         'jeżeli nacisnę przycisk 
        pomoc1 = pomoc1 + 1                 'to z wielką częstotliwością pomoc1 będzie zwiększał się o 1
        pomoc2 = pomoc2 - 2                 'a pomoc2 bedzie zmniejszać się o 2
        If Pomoc1 = 9 Then Pomoc1 = 1       'tutaj ustalam granicę gdyż wartości tych zmiennych muszą mieścić
        If Pomoc2 = 0 Then Pomoc2 = 8       'się w zbiorze liczb <1;8>
        Blok = 0                            'odblokowuje możliwość permutacji
    Else
        If Blok = 0 Then                    'jeżeli możliwość permutacji jest odblokowana
           PomocA = Tabela(pomoc1)          'to pobieram wartość ze zmiennej tablicowej z pod adresu ustalonego
           PomocB = Tabela(pomoc2)          'przez zmienną pomoc1 i pomoc2 (pomoc1 i pomoc2 mają wartości "losowe")
       
           pomoc = PomocA                   'zwykła procedura zamiany wartości zmiennych PomocA o PomocB           
           PomocA = PomocB                 
           PomocB = pomoc

           Tabela(pomoc1) = PomocA          'Ponowne wgranie już zpermutowanych wartości do zmiennych
           Tabela(pomoc2) = PomocB          ' tablicowych
           Blok = 1                         'blokada dalszych permutacji (po naciśnięciu ponownym przycisku
         End If                             'permutacja zostanie odblokowana)
    End If
    Loop
    End


    Z góry dziękuję.

    0 6
  • #2 25 Lut 2012 20:30
    Dżyszla
    Poziom 42  

    A czemu nie zastosujesz funkcji losującej to wymieszania tablicy? To, co masz jest niezwykle powtarzalne i przewidywalne, a chyba nie o to chodziło... Poza tym mam wątpliwości, czy uzyskasz każdą możliwą permutację ;)

    Generalnie - choć języka nie znam - kod wydaje się poprawny i sensowny. Trochę mało eleganckie jest zapisanie tylko za pomocą znaku = granicznych wartości zmiennych pomoc1 i pomoc2, choć w tym przypadku się sprawdzą. Ale bardziej elegancko byłoby >= i <=

    0
  • #3 25 Lut 2012 20:34
    Wojtek001
    Poziom 15  

    Jakiej funkcji losującej? jeśli myślisz o RND to zapomnij bo znacznie lepiej jest inkrementować (dekrementować) zmienne z częstotliwością pracy kwarcu i "zatrzaskiwać wynik".

    0
  • #4 25 Lut 2012 20:38
    Dżyszla
    Poziom 42  

    W jakim sensie "lepiej"? Nie twierdzę, że jest to złe, co zrobiłeś, tylko czy aby spełnia oczekiwania?
    A generalnie - zależy Ci na równomiernym rozkładzie prawdopodobieństwa uzyskiwanej tablicy? Bo jak tak, to ja bym pokusił się o zbadanie tego rozkładu w tym algorytmie.

    0
  • #5 25 Lut 2012 21:09
    Wojtek001
    Poziom 15  

    Wiązało by się to z koniecznością zapisywania seed'a do EEPROMU. Poza tym nie chcę zaprzątać sobie głowy tym RND bo ja mam tu prawi eprawdziwą losowość (o ile w ogóle prawdziwa losowość istnieje) dzięki inkrementacj tych zmiennych pomocniczych.

    0
  • #7 25 Lut 2012 21:31
    Wojtek001
    Poziom 15  

    Dzięki ale proszę jeszcze kogoś znającego BASCOMA o sprawdzenie kodu.

    0