Muszę użyć funkcji RANDBETWEEN programu Microsoft Excel i jestem świadomy, że nowy zestaw liczb losowych jest generowany za każdym razem, gdy robisz cokolwiek innego w arkuszu. Zdaję sobie również sprawę z obejść tego sposobu, aby „zamrozić” zestaw liczb losowych, który został wygenerowany, powiedzmy, do sortowania n list liczb losowych od a do b. Moje pytanie brzmi: DLACZEGO generowane liczby losowe zmieniają się? Czy w algorytmie jest coś, co tego wymaga? FWIW, Arkusze Google, LibreOffice Calc, Apple Numbers wszystkie wykazują to samo zachowanie.
microsoft-excel
nowradioguy
źródło
źródło
Odpowiedzi:
Charles Williams ma dobre wyjaśnienie, jak Excel oblicza rzeczy i dlaczego.
http://www.decisionmodels.com/calcsecretsi.htm
Zasadniczo, jeśli skoroszyt zawiera zmienne funkcje (zapoznaj się z listą Charlesa, ponieważ zmienna funkcja zmieniła się przez lata w różnych wersjach programu Excel), ponowne obliczenie całego skoroszytu zostanie uruchomione po zmianie dowolnej komórki w skoroszycie (jeśli Excel jest ustawiony na automatyczne obliczenia). Jeśli w skoroszycie nie ma żadnych lotnych funkcji, tylko komórki, na które wpłynęła ostatnia zmiana, zostaną ponownie obliczone.
Inni tutaj stwierdzili, że automatyczne obliczanie zawsze obliczy wszystko w skoroszycie, gdy dowolna komórka zostanie zmieniona, ale to źle. Tylko zmienne funkcje powodują automatyczne ponowne obliczenie wszystkich komórek w skoroszycie. Bez zmiennych funkcji program Excel ponownie oblicza tylko to, co należy ponownie obliczyć.
Dlatego ludzie tacy jak ja, którzy znają różnicę, zdecydowanie zalecają unikanie niestabilnych funkcji, takich jak OFFSET () lub INDIRECT () w komórkach arkusza roboczego, jeśli to możliwe, ponieważ serwatka spowolni skoroszyt, powodując pełne ponowne obliczenie po każdej zmianie komórki. Nauka używania INDEX () zamiast OFFSET () może spowodować radykalne zwiększenie prędkości, ponieważ Indeks nie jest zmienny (więcej szczegółów w artykule Charlesa).
Mechanizm obliczeniowy Excela opiera się na filozofii „recalc or die”, która odróżniała Excela od konkurencyjnych produktów, gdy był w fazie rozwoju. Sprawdź ten artykuł: https://www.geekwire.com/2015/recalc-or-die-30-years-later-microsoft-excel-1-0-vets-recount-a-project-that-defied-the -szansa/
źródło
Inne odpowiedzi koncentrują się na mechanice przeliczania i roli funkcji niestabilnych, ale myślę, że to pomija część sedna pytania. Odnosi się do zasad, które zostały zastosowane, ale nie tyle do „dlaczego”. Skupię się na tym.
Zarys projektu
Zacznę od koncepcji projektowej i elementów składowych większości nowoczesnych arkuszy kalkulacyjnych. Istnieje „podział odpowiedzialności”. Funkcje to dedykowane procedury, które wykonują określone zadanie i wykonują je za każdym razem, gdy są o to poproszone. Oddzielnie od tego aplikacja kalkulacyjna kontroluje, kiedy zostanie o to poproszona.
Same funkcje nie zawierają żadnej logiki umożliwiającej ponowne obliczenie lub nieprzeprowadzenie ponownego obliczenia. Charakter wszystkich funkcji Excela polega na wykonywaniu pewnego rodzaju operacji za każdym razem, gdy zostanie do tego wywołany. Żadna funkcja nie ma własnej „pamięci” bieżącej wartości ani historii wcześniejszych obliczeń. Nie ma sposobu, aby wiedzieć, czy po raz pierwszy jest proszony o wykonanie swojej pracy. Dlatego żadna funkcja natywna nie ma możliwości uruchomienia tylko raz. Jeśli jakakolwiek funkcja zostanie ponownie obliczona, zrobi to, do czego została zaprojektowana i wygeneruje nową wartość.
Aplikacja arkusza kalkulacyjnego zawiera pewną inteligencję, która pozwala zaoszczędzić czas, pomijając niepotrzebne ponowne obliczenia (jak opisano w odpowiedzi Teylyna). Tylko raz przeliczanie jest pomijane jest, jeśli aplikacja wie, że wartość danej funkcji nie zostało dotknięte przez zmiany kalkulacyjnych, które spowodowały konieczność ponownego obliczenia rzeczy.
Co jeśli trzeba raz uruchomić funkcję, a następnie zachować jej wartość? Weź przykład tworzenia losowej liczby, a następnie nie zmieniania wyniku. To opisuje tworzenie losowo generowanych stałych i możesz to zrobić za pomocą Excela.
Excel nie może wiedzieć, jak chcesz korzystać z jego możliwości; czy chcesz kontynuować tworzenie nowych wartości, czy zachować ostatni zestaw. Każda opcja jest przypadkiem użycia obsługiwanym przez program Excel. Excel obsługuje oba przypadki, udostępniając narzędzia do obliczania nowych wartości oraz narzędzia do zachowania starych wartości. Możesz zbudować, co chcesz. Ale użytkownik ma obowiązek zrobić to, co chce.
Logika funkcji
Spójrzmy więc na logikę działania funkcji. Czy logika ponownego obliczania może mieć sens, aby pominąć funkcję losową, ponieważ na jej wartość nie powinny mieć wpływu inne zmiany w arkuszu kalkulacyjnym?
To, czy wartość funkcji zmienia się po ponownym obliczeniu, zależy od jej celu i od czego jest oparta. Obliczenia na stałych wartościach zawsze dają ten sam wynik. Operacja oparta na wartościach komórek, które nie uległy zmianie, da ten sam wynik.
Jednak niektóre funkcje zostały zaprojektowane z myślą o celu i za każdym razem generowania innego wyniku. Rozważmy na przykład funkcje oparte na bieżącym czasie. Przyniosą nowy wynik na podstawie czasu ponownego obliczenia. Nie możesz mieć funkcji, której celem jest generowanie wartości na podstawie bieżącego czasu i nie może być aktualizowana po ponownym obliczeniu.
Celem kontroli przeliczania jest zawsze, aby wszystko było odzwierciedlane w bieżącym stanie rzeczy po uruchomieniu przeliczania. To kryterium nie byłoby spełnione, gdyby funkcje oparte na bieżącym czasie nie zostały zaktualizowane.
Funkcje „losowe”, takie jak RANDBETWEEN, mają na celu wygenerowanie nowej liczby losowej po ponownym obliczeniu. Właśnie to zamierzają zrobić. Można argumentować, że ponowne obliczenie może zostać pominięte, ponieważ na wartość nie powinny mieć wpływu inne rzeczy występujące w arkuszu kalkulacyjnym.
Gdyby to było zachowanie domyślne, aktualizowałbyś arkusz kalkulacyjny, ale losowa wartość pozostałaby stała. To niezbyt przypadkowe zachowanie. To by wspierało jeden przypadek użycia, ale nie drugi. Wracając do podstawowej koncepcji projektowej, jest obsługiwany jak każda inna funkcja. Domyślne zachowanie polega na ponownym obliczeniu programu Excel. Jeśli chcesz zachować poprzednią wartość dla swojego przypadku użycia, musisz to zrobić za pomocą dostępnych narzędzi.
źródło
Każda zmiana w arkuszu uruchamia automatyczne przeliczanie wszystkich formuł, co jest zachowaniem domyślnym.
Możesz go wyłączyć lub zamrozić rzeczywistą wartość, przekształcając ją w czystą wartość (jako przeciwieństwo formuły).
źródło
Jest klasyfikowany jako formuła „lotna” i jako taka jest częścią listy funkcji przeliczanych po wykryciu zmiany lub wprowadzeniu nowej funkcji.
Inną opcją do rozważenia jest przełączenie arkusza na obliczenia ręczne, aby kontrolować, kiedy to się stanie - pamiętaj tylko, aby pamiętać o ponownym obliczeniu, ponieważ wszelkie zmiany wartości lub formuł nie spowodują ponownego obliczenia ...
źródło
Pomimo heroicznych wysiłków, aby dźwięk ten brzmiał jak funkcja, a nie błąd, uważam za niezwykle mało prawdopodobne, aby takie zachowanie było rutynowo korzystne. „Funkcje” ułatwiają nam życie, „błędy” utrudniają. W moim przypadku wpisanie etykiety lub wyjaśnienia w komórce, do której nie odwołuje się żadna inna komórka, powoduje ponowną randomizację, z którą trudno sobie poradzić. Nazwałbym to „błędem”.
Tak, mogę ręcznie kontrolować ponowne obliczanie (ból) lub wklejać wartości, aby temu zapobiec (znowu ból), ale w jakich przypadkach ponowna randomizacja spowodowana wprowadzaniem tekstu w odległym obszarze arkusza ułatwia życie?
Nawet jeśli istnieje pewna logika związana z obsługą „niestabilnych” funkcji, wydawałoby się, że banalnie łatwe jest uruchomienie ponownego obliczenia za pomocą odpowiednich kryteriów innych niż zwykłe naciśnięcie „enter” po wpisaniu tekstu w niepowiązanych i niepowiązanych komórkach lub przez inne całkowicie niezwiązane zmiany. Zapobieganie temu powinno być domyślne i nie mogę sobie wyobrazić, że byłoby to trudne do wdrożenia. Jeśli ktoś chce tej „funkcji”, może ją włączyć, ale nie wyobrażam sobie, kiedy byłoby to dobre. W najlepszym razie może być względnie nieszkodliwy. Dla mnie jest to duży problem ze względu na rodzaj arkusza, który tworzę.
Wreszcie - pakiet Analysis Toolpak umożliwia tworzenie rozkładów liczb losowych na różne sposoby, a zakresy tak utworzonych liczb w ogóle nie są ponownie obliczane (ponownie randomizowane), chyba że tak zrobisz. Dlatego zalecam, aby ludzie korzystali z pakietu Analysis ToolPak, gdy spełnia on ich potrzeby.
źródło