Chcę ... uh ... "osłabić" niesamowitą odpowiedź @ Whubera, która według @TomZingera jest zbyt trudna do naśladowania. Mam na myśli to, że chcę to ponownie opisać w taki sposób, że myślę, że Tom Zinger zrozumie, ponieważ jest to zdecydowanie najlepsza odpowiedź tutaj. A ponieważ Tom stopniowo stosuje tę metodę i odkrywa, że potrzebuje, powiedzmy, znać rozmieszczenie próbek, a nie tylko ich średnią, odpowiedź Whubera będzie właśnie tym, czego szuka.
Krótko mówiąc: nie ma tu żadnych oryginalnych pomysłów, tylko prostsze wyjaśnienie.
Chcesz utworzyć $ n $ liczby całkowite od $ 1 $ do 4 $ ze średnią $ r $ . Zasugeruję obliczanie $ n $ liczb całkowitych od $ 0 $ do 3 $ ze średnią $ r-1 $ , a następnie dodaj po jednym do każdego z nich. Jeśli możesz zrobić to drugie, możesz rozwiązać pierwszy problem. Na przykład, jeśli chcemy 10 liczb całkowitych między 1 $ a 4 $ ze średnią 2,6 $ ,
możemy zapisać te 10 $ liczby całkowite z przedziału od 0 $ do 3 $ ...
0,3,2,1,3,1,2,1,3,0
którego średnia wynosi 1,6 USD ; jeśli zwiększymy każdy o 1 $ , otrzymamy
1,4,3,2,4,2,3,2,4,1
którego średnia wynosi 2,6 USD . To takie proste.
Pomyślmy teraz o liczbach od 0 $ do 3 $ . Będę myśleć o nich jako o „ile przedmiotów mam w„ małym ”zestawie?” Mogę nie mieć żadnych przedmiotów, jednego przedmiotu, dwóch lub trzech elementów. Więc lista
0,3,2,1,3,1,2,1,3,0
reprezentuje dziesięć różnych małych zestawów. Pierwsza jest pusta; druga ma trzy elementy i tak dalej. Całkowita liczba elementów we wszystkich zestawach to suma dziesięciu liczb, czyli 16 $ . A średnia liczba elementów w każdym zestawie to suma podzielona przez 10 USD , stąd 1,6 $ .
Pomysł jest taki: załóżmy, że zrobisz sobie dziesięć małych zestawów, z całkowitą liczbą elementów wynoszącą 10 t $ za pewną liczbę $ t $ . Wtedy średni rozmiar zestawów wyniesie dokładnie $ t $ . W ten sam sposób, jeśli utworzysz zestawy $ n $ z łączną liczbą elementów $ nt $ span >, średnia liczba elementów w zestawie wyniesie $ t $ . Mówisz, że interesuje Cię sprawa $ n = 100 $ .
Zróbmy konkretny przykład: potrzebujesz 100 elementów od 1 do 4, których średnia wynosi 1,9 USD . Korzystając z pomysłu z pierwszego akapitu, zmienię to na „make 100 $ ints między $ 0 $ span> i 3 $ , których średnia wynosi 0,9 $ ". Kiedy skończę, dodam 1 $ do każdego z moich int, aby znaleźć rozwiązanie Twojego problemu. Tak więc moja średnia docelowa to $ t = 0,9 $ .
Chcę zrobić zestawy 100 USD , każdy zawierający od 0 $ do 3 $ elementów, o średnim rozmiarze zestawu 0,9 $ .
Jak zauważyłem powyżej, oznacza to, że musi istnieć całkowita 100 $ \ cdot 0.9 = 90 $ elementów w zestawy. Z liczb 1, 2, \ ldots, 300 $ , wybiorę dokładnie 90 $ . Mogę wskazać wybrane, tworząc listę 300 kropek i X-ów:
..X .... X ... XX ...
gdzie powyższa lista wskazuje, że wybrałem liczby 3, 9, 13, 14, a następnie wiele innych, których nie pokazałem, ponieważ mam dość pisania. :)
Mogę wziąć tę sekwencję 300 kropek i X i podzielić ją na trzy grupy po 100 kropek, które układam jedna na drugiej, uzyskując coś, co wygląda tak:
... X .... X..X ..... X ...
.X ... X ..... X ... X .....
..X ... X.X..X ...... X ..
ale dotyczy pełnych 100 pozycji w każdym wierszu. Liczba X w każdym wierszu może się różnić - na przykład może być 35 w pierwszym rzędzie, 24 w drugim i 31 w trzecim, i to jest OK. [Dzięki Whuberowi za wskazanie, że popełniłem błąd w pierwszej wersji roboczej!]
Teraz spójrz na każdą kolumnę : każda kolumna może być traktowana jako zestaw, a ten zestaw zawiera od 0 do 3 „X”. Mogę napisać podliczenia pod wierszami, aby uzyskać coś takiego:
... X .... X..X ..... X ...
.X ... X ..... X ... X .....
..X ... X.X..X ...... X ..
011101102003000101100
To znaczy, że utworzyłem 100 liczb, każda z przedziału od 1 do 3. Suma tych 100 liczb musi być łączną liczbą X-ów we wszystkich trzech wierszach, czyli 90. Zatem średnia musi być 90/100 = 0,9 USD , zgodnie z potrzebami.
Oto kroki prowadzące do uzyskania 100 liczb całkowitych od 1 do 4, których średnia wynosi dokładnie $ s $ .
- Niech $ t = s - 1 $ .
- Oblicz $ k = 100 t $ ; tyle w sumie umieścimy w wierszach.
- Zrób listę 300 kropek lub X, $ k $ , z których Xs.
- Podziel to na trzy rzędy po 100 kropek lub X, z których każdy zawiera mniej więcej jedną trzecią znaków X.
- Ułóż je w tablicy i oblicz sumy kolumn, uzyskując 100 liczb całkowitych między 0 $ a 3 $ span >. Ich średnia będzie wynosić $ t $ .
- Dodaj po jednej do każdej sumy kolumny, aby otrzymać 100 liczb całkowitych od 1 $ do 4 $ , których średnia to $ s $ .
Teraz najtrudniejsza część jest tak naprawdę w kroku 4: jak wybrać 300 $ elementów, $ k $ z których to „X”, a pozostałe 300-tys. $ , z czego "."? Okazuje się, że R ma funkcję, która dokładnie to robi.
A potem whuber powie Ci, jak go używać: piszesz
tabulate (sample.int ((k-1) * n, s-n) %% n + 1, n)
W Twoim przypadku $ n = 100 $ i $ s $ , łączna liczba elementów we wszystkich małych zestawach to 100r $ , a chcesz mieć liczby od 1 $ do 4 $ , więc $ k = 4 $ , więc $ k -1 $ (największy rozmiar dla „małego zestawu”) to 3, więc otrzymujemy
tabulate (sample.int (3 * 100, 100r-100) %% 100 + 1, n)
lub
tabulate (sample.int (3 * 100, 100 * (r-1)) %% 100 + 1, 100)
lub, używając mojego imienia i nazwiska $ t $ dla $ r - 1 $ , stanie się
tabulate (sample.int (3 * 100, 100 * t) %% 100 + 1, 100)
„+1” na końcu jego pierwotnej formuły to dokładnie krok potrzebny do konwersji z „liczb między 0 $ a 3 $ " na "numery od 1 $ do 4 $ ".
Pracujmy od wewnątrz i uprośćmy do $ n = 10 $ , abym mógł pokazać przykładowe wyniki:
tabulate (sample.int (3 * 10, 10 * t) %% 10 + 1, 10)
I zmieńmy na $ t = 1,9 $ , więc otrzymamy
tabulate (sample.int (3 * 10, 10 * 1,9) %% 10 + 1, 10)
Zaczynając od sample.int (3 * 10, 10 * 1,9)
: w ten sposób powstaje lista 19 $ liczb całkowitych między 1 $ i 30 $ . (tj. rozwiązał problem polegający na wybieraniu $ k $ liczb z łącznej kwoty - 300 $ w Twój prawdziwy problem, 30 $ w moim mniejszym przykładzie).
Jak sobie przypominasz, chcemy utworzyć trzy rzędy po dziesięć kropek-X każdy, coś w rodzaju
X.X.XX.XX.
XXXX.XXX ..
XX.X.XXX ..
Możemy przeczytać ten tekst od lewej do prawej z góry na dół (tj. normalny porządek czytania), aby stworzyć listę lokalizacji dla X: pierwsza pozycja to kropka; druga i trzecia to X i tak dalej, więc nasza lista lokalizacji zaczyna się $ 1, 3, 5, 6, \ ldots $ . Kiedy docieramy do końca wiersza, po prostu liczymy w górę, więc na powyższym obrazku lokalizacje X będą wynosić $ 1, 3, 5, 6, 8, 9, 11, 12, 13, 14, 16, 17, 18, 21, 22, 24, 26, 27, 28 $ . Czy to jasne?
Cóż, kod Whubers tworzy dokładnie taką listę lokalizacji z jej najbardziej wewnętrzną sekcją.
Następna pozycja to %% 10
; która przyjmuje liczbę i tworzy resztę z dzielenia przez dziesięć. Więc nasza lista to $ 1, 3, 5, 6, 8, 9, 1, 2, 3, 4, 6, 7, 8, 1, 2, 4, 6, 7, 8 $ . Jeśli podzielimy to na trzy grupy - te, które pochodzą z liczb od 1 $ do 10 $ , te, które pochodzą z liczb od 11 $ do 20 $ , oraz te, które pochodzą z liczb 21 $ do 30 $ , otrzymujemy $ 1, 3, 5, 6, 8, 9 $ , następnie $ 1, 2, 3, 4, 6, 7, 8, $ i na końcu 1 $, 2, 4, 6, 7, 8 $ . Mówią ci, gdzie znajdują się X w każdym z trzech rzędów. Występuje tutaj subtelny problem: gdyby na pozycji 10 w pierwszym wierszu znajdował się X, pierwsza z naszych trzech list byłaby $ 1, 3, 5, 6, 8, 9 , 0 $ , a funkcja tabulate
nie lubi „0”. Whuber dodaje 1 do każdej pozycji na liście, aby uzyskać $ 2, 4, 6, 7, 9, 10, 1 $ . Przejdźmy do ogólnych obliczeń:
tabulate (sample.int (3 * 10, 10 * 1,9) %% 10 + 1, 10)
To pyta „dla tych 30 $ liczb, z których każda wskazuje, czy w jakiejś kolumnie jest znak X, powiedz mi, ile razy każda kolumna (z 1 $ do 10 $ - to właśnie mówi ci ostatnia" 10 "), tzn. powiedz mi ile X są w każdej kolumnie. Wynik to
0 3 2 2 2 1 3 2 3 1
które (z powodu przesunięcia o jedną rzecz) musisz odczytać jako „nie ma X-ów w dziesiątej kolumnie; 3 X-y w pierwszej kolumnie; 2 X-y w drugiej kolumnie” i tak dalej w górę do „jest jeden X w dziewiątej kolumnie”.
Daje to dziesięć liczb całkowitych z przedziału od 0 $ do 3 $ , których suma wynosi 19 $ , stąd jego średnia wynosi 1,9 $ . Jeśli zwiększysz każdy o 1, otrzymasz dziesięć liczb całkowitych od 1 $ do 4 $ , których suma wynosi 29 $ , stąd średnia wartość 2,9 $ .
Mam nadzieję, że możesz uogólnić na $ n = 100 $ .