Losowanie 2

Mam prostą zagadkę dla fachowców od karkuszy: w jaki sposób, za pomocą Excela, wylosować trzy różne liczby całkowite z przedziału 1 – 10? Wszystkich kombinacji jest zaledwie 720 (10*9*8), a więc możnaby je zakodować “na twardo” w arkuszu i po prostu losować jedną z nich, ale szukam czegoś bardziej eleganckiego. I w miarę prostego.

Udało mi się to zrealizować zarówno “czystym” Excelem, jak też odrobiną VBA. Rozwiązanie oparte czysto na formułach jest przekombinowane (żeby wylosować trzy liczby muszę użyć łącznie 30 komórek – a więc strasznie nieefektywne). Z kolei rozwiązanie z VBA to zaledwie 16 linijek kodu, ale VBA to zawsze ostateczność jak się już całkiem polegnie na metodach tradycyjnych. Czyli strzelanie z armaty do komarów.

Poniżej przedstawiam obydwa moje rozwiązania.

Rozwiązanie 1, bez VBA:

(kliknij w obrazek aby zobaczyć go w pełnej rozdzielczości)

(obrazek mi niestety wcięło przy kolejnej przeprowadzce, kiedyś odtworzę i wrzucę)

<miejsce na obrazek>

 

Rozwiązanie 2, z użyciem VBA:

Public Sub rnd3()
    Dim a As Integer, b As Integer, c As Integer
    Randomize Timer
    a = 1 + (Rnd * 1000 Mod 10)
    b = 1 + (Rnd * 1000 Mod 10)
    c = 1 + (Rnd * 1000 Mod 10)
    Do While b = a
        b = 1 + (Rnd * 1000 Mod 10)
    Loop
    Do While c = a Or c = b
        c = 1 + (Rnd * 1000 Mod 10)
    Loop
    Range("A1").Value = a
    Range("B1").Value = b
    Range("C1").Value = c
End Sub

Rozwiązanie pierwsze dobrze się skaluje “w pionie”, a więc bez większych przeróbek można je rozciągnąć na “wylosuj 3 z 20” albo “wylosuj 3 ze 100” itd. W poziomie się nie skaluje prawie w ogóle (ilość IF-ów do pozagnieżdżania rośnie z każdą losowaną liczbą).

Rozwiązanie drugie “w pionie” skaluje się też dobrze, “w poziomie” trochę gorzej (ale dużo lepiej od rozwiązania pierwszego), przy większych grupach losowanych liczb da się je dodatkowo “utablicować”, a więc zamiast a, b, c zbudować poindeksowaną tablicę losowanych wartości. Czyli jest lepsze z punktu widzenia samego algorytmu, ale wymaga od użytkownika umiejętności uruchamiania kodu VBA.

Jakieś lepsze pomysły?


Liczba słów w tym wpisie: 349

Sprawdź też

Siedem tygodni, czyli rzecz o szukaniu pracy w czasach zarazy

Blog mi ostatnio zwolnił do ślimaczego tempa. Trochę dlatego, że postanowiłem sobie zrobić przerwę od …

Pchełki Powershell: odzyskujemy klucz aktywacyjny do Windows 10

Niedawno zachciało mi się na jednym z domowych laptopów przetestować Docker for Windows. Niektóre opcje …

Zapisz się
Powiadom o
guest
0 komentarzy
Inline Feedbacks
Zobacz wszystkie komentarze
0
Zapraszam do skomentowania wpisu.x
()
x