Losowanie 2

https://xpil.eu/Ye5co

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?

https://xpil.eu/Ye5co

Leave a Comment

Komentarze mile widziane.

Jeżeli chcesz do komentarza wstawić kod, użyj składni:
[code]
tutaj wstaw swój kod
[/code]

Jeżeli zrobisz literówkę lub zmienisz zdanie, możesz edytować komentarz po jego zatwierdzeniu.