Generator listy randomizacji
Lista przydziału z ziarnem, podsumowaniem i plikiem CSV
Ustaw tryb, ramiona, proporcje i ziarno, a generator przygotuje listę przydziału z identyfikatorami miejsc. Domyślne ustawienia to przykład omówiony niżej. Lista powstaje w Twojej przeglądarce: nic nie jest wysyłane ani zapisywane, a ten sam zestaw ustawień i to samo ziarno dają zawsze tę samą listę.
Generator wymaga włączonej obsługi JavaScriptu. Wynik dla ustawień domyślnych opisujemy w przykładzie poniżej.
Tu pojawi się lista przydziału.
Raport ustawień do dokumentacji badania
Jak używać generatora
Generator przyda się, gdy planujesz badanie z randomizacją i potrzebujesz gotowej listy: do zestawu kopert, do numerowanych opakowań przygotowanych przez aptekę albo do wgrania do systemu, który wydaje przydziały po kolei. Wybór metody i jej uzasadnienie omawiamy we wpisie o randomizacji w praktyce. Tu skupiamy się na samej liście: jak ją ustawić, sprawdzić i udokumentować.
- Tryb. Randomizacja prosta przydziela każde miejsce niezależnie, jak rzut monetą, tyle że liczbami losowymi z komputera (Altman i Bland, 1999). Randomizacja blokowa składa listę z bloków, w których każde ramię występuje dokładnie tyle razy, ile wynika z proporcji. Randomizacja warstwowa tworzy osobną listę bloków dla każdej warstwy, czyli kombinacji poziomów czynników.
- Ramiona i proporcje. Wpisz od 2 do 4 nazw ramion, oddzielonych średnikiem, i proporcje w liczbach całkowitych, np. 1:1, 2:1 albo 1:1:1. Proporcje podawaj w postaci skróconej: zamiast 2:2 wpisz 1:1, a dłuższy blok ustaw w polu długości bloków.
- Długości bloków. Każda długość musi być wielokrotnością sumy proporcji. Przy 2:1 suma wynosi 3, więc możliwe są bloki 3, 6, 9, 12. Przy 1:1:1 też 3, 6, 9, a przy 1:1:1:1 – 4, 8, 12. Gdy podasz kilka długości, generator losuje długość każdego bloku, każdą z tym samym prawdopodobieństwem. Taki schemat opisuje Efird (2011).
- Czynniki warstwujące. Każdy czynnik wpisz w osobnym wierszu: nazwa, dwukropek, poziomy po przecinku, np. „Ból: umiarkowany, silny”. Warstwy powstają ze wszystkich kombinacji poziomów, więc dwa czynniki po 3 i 2 poziomy dają 6 warstw. Generator przyjmuje do 3 czynników i 48 warstw.
- Liczba miejsc. W trybie warstwowym to liczba miejsc w każdej warstwie. Ponieważ nie wiesz z góry, ile osób trafi do której warstwy, ustaw ją z zapasem. Przy opcji „Dokończ blok” lista kończy się zawsze pełnym blokiem, więc bywa nieco dłuższa niż podana liczba.
- Ziarno. Ziarno to punkt startowy generatora. Może być liczbą albo dowolnym tekstem, np. kodem badania. Do prawdziwego badania wybierz ziarno, którego nikt nie odgadnie. Przycisk „Losowe ziarno” pobiera je z generatora kryptograficznego przeglądarki.
Po kliknięciu „Generuj listę” zobaczysz liczebności ramion w każdej warstwie, wynik kontroli bloków, listę i raport ustawień. Pliki CSV i TXT zapiszesz przyciskami pod listą. CSV ma kolumny: numer, identyfikator miejsca, warstwa z poziomami czynników, numer i długość bloku oraz ramię. Kodowanie to UTF-8, więc Excel poprawnie pokaże polskie znaki.
Jak działa generator
Każdy krok jest deterministyczny: te same ustawienia i to samo ziarno dają tę samą listę w każdej przeglądarce. Algorytm wygląda tak:
- Ziarno. Liczba całkowita od 0 do 4 294 967 295 przechodzi bez zmian. Każdy inny tekst zamieniany jest na liczbę 32-bitową funkcją skrótu FNV-1a, liczoną na bajtach UTF-8. Spacje na początku i końcu są pomijane, a wielkość liter ma znaczenie.
- Osobny strumień dla każdej warstwy. Warstwa k dostaje własne ziarno, wyliczone z ziarna głównego i numeru warstwy. Dzięki temu zmiana liczby miejsc w jednej warstwie nie zmienia list w pozostałych. Dłuższa lista z tym samym ziarnem zaczyna się tak samo jak krótsza.
- Liczby losowe. Generator Mulberry32 daje ciąg liczb 32-bitowych. To ten sam generator, którego używa nasz kalkulator efektu pośredniego Monte Carlo. Liczbę całkowitą z zakresu od 0 do m − 1 losujemy z odrzucaniem: wartości z niepełnego końca zakresu są pomijane, więc żadna liczba nie jest uprzywilejowana.
- Randomizacja prosta. Dla każdego miejsca losujemy liczbę od 0 do S − 1, gdzie S to suma proporcji. Przy 2:1 wartości 0 i 1 oznaczają pierwsze ramię, a 2 – drugie.
- Blok. Najpierw losujemy długość bloku (gdy podano kilka), potem wypełniamy blok ramionami według proporcji i tasujemy go algorytmem Fishera–Yatesa. Każdy układ bloku jest wtedy równie prawdopodobny.
Na przykład blok 9 przy proporcji 2:1 zawiera 6 przydziałów do pierwszego ramienia i 3 do drugiego. Liczba możliwych układów takiego bloku to 9! / (6! × 3!) = 84.
Generator nie odtwarza set.seed() z R. R domyślnie używa generatora Mersenne Twister (Matsumoto i Nishimura, 1998), a funkcja sample() ma własny sposób zamiany liczb losowych na wybór elementów. Lista z tej strony i lista z R przy tym samym ziarnie będą więc inne. Obie są równie poprawne, ale listę odtworzysz tylko tym narzędziem, w tej samej wersji. Dlatego raport ustawień podaje wersję generatora, a plik CSV warto zachować razem z raportem.
Suma kontrolna to 8-znakowy skrót FNV-1a z identyfikatorów i ramion całej listy. Gdy ktoś zmieni choć jeden przydział, suma się zmieni. Nie jest to zabezpieczenie kryptograficzne, tylko szybki sposób, żeby sprawdzić, czy plik w rękach osoby prowadzącej przydział jest tym samym plikiem, który opisano w dokumentacji.
Przykład: badanie 2:1 w trzech ośrodkach
Zespół planuje badanie programu rehabilitacji w trzech ośrodkach: w Krakowie, Lublinie i Gdańsku. Na każdą osobę w grupie kontrolnej przypadają dwie osoby w grupie interwencji, bo zespół chce zebrać więcej danych o bezpieczeństwie programu. Statystyk spoza zespołu klinicznego generuje listę warstwową według ośrodka z blokami 6 albo 9 i rezerwuje 30 miejsc na ośrodek. Ziarno „PROTOKOL-2026-07” jest wpisane w generator, więc po otwarciu strony zobaczysz właśnie tę listę.
| Warstwa | Miejsca na liście | Bloki (długość) | Interwencja | Kontrola |
|---|---|---|---|---|
| W01: Kraków | 30 | 6, 6, 9, 9 | 20 | 10 |
| W02: Lublin | 30 | 9, 9, 6, 6 | 20 | 10 |
| W03: Gdańsk | 33 | 9, 9, 9, 6 | 22 | 11 |
| Razem | 93 | 12 bloków | 62 | 31 |
Wszystkie 12 bloków ma dokładnie proporcję 2:1. W Gdańsku trzy bloki po 9 dały 27 miejsc, więc generator dołożył czwarty blok i lista ma 33 miejsca zamiast 30. Pierwszy blok w Krakowie ma układ: Interwencja, Interwencja, Kontrola, Interwencja, Interwencja, Kontrola. Identyfikatory mają postać PR-W01-001, czyli prefiks, warstwa i numer miejsca. Suma kontrolna listy to B6A2C7FD. Jeśli po wygenerowaniu widzisz inną sumę, zmieniło się któreś ustawienie.
Kontrola w generatorze pokazuje też największe odchylenie liczebności ramienia od wartości oczekiwanej w trakcie rekrutacji. Przy proporcji 2:1 po 4 przydziałach oczekujemy 2.67 osoby w grupie interwencji. Odchylenie mierzy, o ile rzeczywista liczba odbiega od takiej wartości w najgorszym momencie. W blokach jest ono ograniczone długością bloku. W randomizacji prostej nie ma takiej granicy.
Ta sama procedura w bazowym R
Kod tworzy listę według tego samego schematu (2:1, bloki 6 albo 9, trzy ośrodki, 30 miejsc na ośrodek) funkcjami sample() i rep(). Ponieważ R ma inny generator liczb losowych, lista będzie inna niż na stronie. Zgodne są reguły: skład bloków, dokładanie pełnych bloków i liczebności.
Lista warstwowa z blokami o losowej długości
R
# Lista randomizacji warstwowej z blokami o losowej długości – ta sama procedura w bazowym R
# Ramiona: Interwencja i Kontrola w proporcji 2:1; bloki 6 albo 9; warstwy: 3 ośrodki; 30 miejsc na warstwę.
# Uwaga: R używa innego generatora liczb losowych niż kalkulator, więc lista będzie inna niż na stronie.
set.seed(20261102)
ramiona <- c("Interwencja", "Kontrola")
proporcje <- c(2, 1)
dlugosci <- c(6, 9) # każda długość musi być wielokrotnością sumy proporcji (3)
osrodki <- c("Kraków", "Lublin", "Gdańsk")
n_warstwa <- 30
lista_blokowa <- function(n, ramiona, proporcje, dlugosci) {
stopifnot(all(dlugosci %% sum(proporcje) == 0))
wynik <- NULL
blok <- 0
while (is.null(wynik) || nrow(wynik) < n) { # dokładamy pełne bloki, aż starczy miejsc
blok <- blok + 1
k <- if (length(dlugosci) == 1) dlugosci else sample(dlugosci, 1)
zawartosc <- rep(ramiona, times = proporcje * k / sum(proporcje))
wynik <- rbind(wynik, data.frame(blok = blok, dlugosc_bloku = k, ramie = sample(zawartosc)))
}
wynik
}
lista <- do.call(rbind, lapply(seq_along(osrodki), function(w) {
l <- lista_blokowa(n_warstwa, ramiona, proporcje, dlugosci)
data.frame(id = sprintf("PR-W%02d-%03d", w, seq_len(nrow(l))), warstwa = osrodki[w], l)
}))
head(lista, 9)
table(lista$warstwa, lista$ramie)[osrodki, ]
# Kontrola: każdy pełny blok ma dokładnie proporcje 2:1
sklad <- aggregate(ramie ~ warstwa + blok + dlugosc_bloku, data = lista,
FUN = function(r) sum(r == "Interwencja") / length(r))
all(sklad$ramie == 2 / 3)
# Zapis do pliku dla osoby, która prowadzi przydział (średnik jako separator, jak w polskim Excelu)
write.csv2(lista, "lista-randomizacji.csv", row.names = FALSE, fileEncoding = "UTF-8")
RNGkind() # generator R: Mersenne Twister, losowanie z odrzucaniemWynik w R
id warstwa blok dlugosc_bloku ramie
1 PR-W01-001 Kraków 1 6 Kontrola
2 PR-W01-002 Kraków 1 6 Interwencja
3 PR-W01-003 Kraków 1 6 Interwencja
4 PR-W01-004 Kraków 1 6 Interwencja
5 PR-W01-005 Kraków 1 6 Interwencja
6 PR-W01-006 Kraków 1 6 Kontrola
7 PR-W01-007 Kraków 2 6 Interwencja
8 PR-W01-008 Kraków 2 6 Kontrola
9 PR-W01-009 Kraków 2 6 Interwencja
Interwencja Kontrola
Kraków 22 11
Lublin 20 10
Gdańsk 20 10
[1] TRUE
[1] "Mersenne-Twister" "Inversion" "Rejection"Bibliografia oprogramowania
Wynik pochodzi z uruchomienia pokazanego kodu w R 4.5.3 (funkcje sample(), rep(), aggregate() i write.csv2() z pakietów base, stats i utils). Generator na stronie sprawdzono na 59 przypadkach testowych: powtarzalność list i sum kontrolnych (z niezależną implementacją w Pythonie), skład bloków, proporcje i częstości przy 10 000 losowań.
- R: R Core Team. (2026). R: A language and environment for statistical computing (Version 4.5.3) [Computer software]. R Foundation for Statistical Computing. https://www.R-project.org/
Jak sprawdzić i przechować listę
Listę przed użyciem sprawdza osoba, która ją wygenerowała. Nie robi tego zespół rekrutujący. Pomaga w tym krótka lista kontrolna:
- Liczebności. Suma wierszy w każdej warstwie powinna pokrywać planowaną rekrutację z zapasem. Zapas dobierz do niepewności co do rozkładu uczestników między ośrodki. Jeśli warstwa się wyczerpie, a nie ma zapasu, zespół zacznie improwizować.
- Bloki. Generator podaje liczbę pełnych bloków i potwierdza, że każdy ma dokładnie zadane proporcje. Gdy wybierzesz przycinanie ostatniego bloku, grupy na końcu listy nie muszą być w proporcji.
- Odtworzenie. Wygeneruj listę drugi raz z tymi samymi ustawieniami i porównaj sumę kontrolną. Zapisz ją w raporcie. Po zakończeniu badania pozwala wykazać, że użyto listy przygotowanej przed rekrutacją.
- Rozdzielenie plików. Osoba niezależna przechowuje raport z ziarnem i długościami bloków oraz pełny plik CSV. Osoby rekrutujące widzą najwyżej numer kolejnego miejsca, a nie ramię. Długości bloków nie umieszczaj w dokumentach dostępnych dla ośrodków.
Sama lista nie wystarczy. Altman i Schulz (2001) podkreślają, że osoba generująca sekwencję nie powinna kwalifikować ani włączać uczestników. Najlepsze są mechanizmy zewnętrzne: centralna randomizacja albo apteka z kolejno numerowanymi, identycznymi opakowaniami. Koperty muszą być nieprzezroczyste, zaklejone i otwierane po kolei, dopiero po wpisaniu danych uczestnika. Ukrycie przydziału to coś innego niż zaślepienie: chroni do chwili przydziału i da się je zapewnić w każdym badaniu.
Ograniczenia
- Brak minimalizacji. Minimalizacja przydziału nie tworzy listy z góry: przydział zależy od cech osób już włączonych. Wymaga więc systemu działającego w trakcie rekrutacji, a nie pliku.
- Liczba warstw. Kernan i in. (1999) zalecają ograniczać liczbę warstw i dobierać czynniki, które silnie wpływają na rokowanie. Przy wielu warstwach i małej próbie wiele warstw kończy się niedomkniętym blokiem, a nierówności się sumują. Generator ostrzega przed takim układem.
- Przewidywalność. Stała długość bloku, szczególnie równa sumie proporcji, pozwala odgadnąć ostatnie przydziały w bloku. Schulz i Grimes (2002) zalecają losowo zmieniać długość bloków i używać dłuższych bloków, zwłaszcza gdy badanie nie jest zaślepione.
- Randomizacja klastrowa i badania naprzemienne. Gdy losujesz szkoły albo oddziały, lista dotyczy klastrów, a nie osób, i ma swoje zasady opisane we wpisie o randomizacji klastrowej. W schemacie naprzemiennym losujesz kolejność warunków. Jako ramiona wpisz wtedy sekwencje, np. „AB; BA”.
- Analiza. Lista nie rozwiązuje analizy. Czynniki warstwujące uwzględnij jako kowarianty w analizie głównej. Kahan i Morris (2012) pokazali, że analiza bez nich daje za szerokie przedziały ufności i mniejszą moc. Zapisz to w planie analizy statystycznej, a uczestników analizuj według przydzielonego ramienia (ITT).
- Proporcje a moc. Przydział 2:1 przy tej samej łącznej liczbie osób daje zwykle mniejszą moc niż 1:1. Liczebność policz przed generowaniem listy, np. w kalkulatorze liczebności próby.
Zapis w protokole i raporcie
CONSORT 2025 wymaga opisu, kto i jak wygenerował sekwencję, jaki był rodzaj randomizacji z jej ograniczeniami (np. długość bloków i czynniki warstwujące), jak ukryto przydział i kto miał dostęp do sekwencji (Hopewell i in., 2025). Wybór listy kontrolnej i jej rozszerzeń omawia wpis o wytycznych raportowania CONSORT, STROBE i TRIPOD. Wzór dla przykładu z tej strony:
W protokole możesz dodać raport ustawień z generatora jako załącznik zamknięty, dostępny dopiero po zakończeniu rekrutacji. Ocena procesu randomizacji jest osobną domeną narzędzia RoB 2, więc staranny opis ułatwi też przyszłe przeglądy systematyczne. Cały proces badania od planu do raportu porządkuje przewodnik po badaniach klinicznych. Jeśli przygotowujesz protokół z randomizacją warstwową albo nierównym przydziałem i chcesz sprawdzić schemat przydziału oraz plan analizy, zajrzyj do oferty analiz dla badaczy.
Najczęstsze pytania
Jak wygenerować listę randomizacji z przydziałem 2:1?
Wpisz proporcje 2:1 i długości bloków, które są wielokrotnością sumy proporcji, czyli 3, 6, 9 albo 12. Każdy blok 6 zawiera wtedy 4 przydziały do pierwszego ramienia i 2 do drugiego, w losowej kolejności. Podaj co najmniej dwie długości, np. 6 i 9, żeby nikt nie mógł odgadnąć ostatnich przydziałów w bloku. Generator na tej stronie sprawdza skład każdego bloku i podaje liczebności ramion.
Dlaczego lista z tym samym ziarnem w R wychodzi inna niż na stronie?
Ziarno ustawia tylko punkt startowy generatora liczb losowych, a R i ta strona używają różnych generatorów. R domyślnie korzysta z generatora Mersenne Twister (Matsumoto i Nishimura, 1998), a strona z Mulberry32. Obie listy są poprawne, ale odtworzysz każdą tylko tym narzędziem, którym ją wygenerowano. Dlatego w raporcie zapisz nazwę i wersję generatora oraz zachowaj plik z listą.
Ile miejsc zarezerwować w każdej warstwie listy randomizacji?
Więcej, niż wynika z planu rekrutacji, bo nie wiesz z góry, ile osób trafi do każdego ośrodka czy kategorii. Zapas dobierz do niepewności rozkładu uczestników, a listę kończ pełnym blokiem. Nieużyte miejsca nie szkodzą, a wyczerpana warstwa zmusza zespół do improwizacji. Liczbę warstw ogranicz do kilku, bo przy wielu warstwach i małej próbie nierówności się sumują (Kernan i in., 1999).
Czy listę randomizacji może przygotować badacz, który rekrutuje uczestników?
Nie, jeśli badanie ma ukrycie przydziału. Altman i Schulz (2001) podkreślają, że osoba generująca sekwencję nie powinna kwalifikować ani włączać uczestników, bo znajomość kolejnego przydziału może wpłynąć na decyzję o włączeniu. Listę przygotowuje osoba niezależna, a przydział przekazuje centralny system, apteka albo kolejno numerowane, nieprzezroczyste koperty.
Co wpisać w protokole o liście randomizacji?
Podaj, kto i kiedy wygenerował sekwencję, jakim narzędziem, jaki był rodzaj randomizacji, proporcje, długości bloków i czynniki warstwujące oraz jak ukryto przydział. Tego wymaga CONSORT 2025 (Hopewell i in., 2025). Ziarno, długości bloków i sumę kontrolną listy przechowuje osoba niezależna. W dokumentach dostępnych dla ośrodków podaj je dopiero po zakończeniu rekrutacji.
Powiązane hasła
Przeczytaj też
Randomizacja w praktyce
Bloki o losowej długości, warstwy, minimalizacja Pococka–Simona i ukrycie przydziału – lista przydziału w R, symulacja i wzór opisu CONSORT.
Czytaj →PoradnikSTROBE, CONSORT i TRIPOD – która lista
Jak dobrać listę raportowania do schematu badania, wypełnić ją z numerami stron i obsłużyć punkty „nie dotyczy” – z tabelą i schematem wyboru.
Czytaj →PoradnikRandomizacja klastrowa – plan i analiza
ICC z przedziałem ufności, efekt schematu przy nierównych oddziałach, cztery analizy tych samych danych, poprawki df i raport CONSORT – z kodem R.
Czytaj →PoradnikBadania kliniczne i pomiar przed i po – przewodnik
Osiem etapów badania z interwencją: schemat, etyka, błąd pomiaru, liczebność, ITT, ANCOVA, RCI i MCID oraz CONSORT – z linkami do każdego etapu.
Czytaj →Przygotowujesz badanie z randomizacją?
Pomożemy dobrać schemat przydziału, przygotować listę randomizacji z dokumentacją, opisać ją w protokole zgodnie z CONSORT i zaplanować analizę z czynnikami warstwującymi, którą obronisz przed recenzentami.
Oferta dla badaczyPorozmawiaj o projekcieBibliografia i dalsza literatura naukowa (APA 7)
- Altman, D. G., & Bland, J. M. (1999). Statistics notes: How to randomise. BMJ, 319(7211), 703–704. https://doi.org/10.1136/bmj.319.7211.703 ● Otwarty dostęp
- Altman, D. G., & Schulz, K. F. (2001). Concealing treatment allocation in randomised trials. BMJ, 323(7310), 446.1–447. https://doi.org/10.1136/bmj.323.7310.446 ● Otwarty dostęp
- Efird, J. (2011). Blocked randomization with randomly selected block sizes. International Journal of Environmental Research and Public Health, 8(1), 15–20. https://doi.org/10.3390/ijerph8010015 ● Otwarty dostęp
- Hopewell, S., Chan, A.-W., Collins, G. S., Hróbjartsson, A., Moher, D., Schulz, K. F., Tunn, R., Aggarwal, R., Berkwits, M., Berlin, J. A., Bhandari, N., Butcher, N. J., Campbell, M. K., Chidebe, R. C. W., Elbourne, D., Farmer, A., Fergusson, D. A., Golub, R. M., Goodman, S. N., . . . Boutron, I. (2025). CONSORT 2025 explanation and elaboration: Updated guideline for reporting randomised trials. BMJ, 389, Article e081124. https://doi.org/10.1136/bmj-2024-081124 ● Otwarty dostęp
- Kahan, B. C., & Morris, T. P. (2012). Improper analysis of trials randomised using stratified blocks or minimisation. Statistics in Medicine, 31(4), 328–340. https://doi.org/10.1002/sim.4431
- Kernan, W. N., Viscoli, C. M., Makuch, R. W., Brass, L. M., & Horwitz, R. I. (1999). Stratified randomization for clinical trials. Journal of Clinical Epidemiology, 52(1), 19–26. https://doi.org/10.1016/S0895-4356(98)00138-3 ● Otwarty dostęp
- Matsumoto, M., & Nishimura, T. (1998). Mersenne twister: A 623-dimensionally equidistributed uniform pseudo-random number generator. ACM Transactions on Modeling and Computer Simulation, 8(1), 3–30. https://doi.org/10.1145/272991.272995 ● Otwarty dostęp: pełny tekst
- Schulz, K. F., & Grimes, D. A. (2002). Generation of allocation sequences in randomised trials: Chance, not choice. The Lancet, 359(9305), 515–519. https://doi.org/10.1016/s0140-6736(02)07683-3
Cytowania BibTeX
@article{altman1999how, author={Altman, Douglas G. and Bland, J. Martin}, title={{Statistics notes: How to randomise}}, journal={BMJ}, year={1999}, volume={319}, number={7211}, pages={703--704}, doi={10.1136/bmj.319.7211.703}}@article{altman2001concealing, author={Altman, Douglas G. and Schulz, Kenneth F.}, title={{Concealing treatment allocation in randomised trials}}, journal={BMJ}, year={2001}, volume={323}, number={7310}, pages={446.1--447}, doi={10.1136/bmj.323.7310.446}}@article{efird2011blocked, author={Efird, Jimmy}, title={{Blocked randomization with randomly selected block sizes}}, journal={International Journal of Environmental Research and Public Health}, year={2011}, volume={8}, number={1}, pages={15--20}, doi={10.3390/ijerph8010015}}@article{hopewell2025consort, author={Hopewell, Sally and Chan, An-Wen and Collins, Gary S. and Hróbjartsson, Asbjørn and Moher, David and Schulz, Kenneth F. and Tunn, Ruth and Aggarwal, Rakesh and Berkwits, Michael and Berlin, Jesse A. and Bhandari, Nita and Butcher, Nancy J. and Campbell, Marion K. and Chidebe, Runcie C. W. and Elbourne, Diana and Farmer, Andrew and Fergusson, Dean A. and Golub, Robert M. and Goodman, Steven N. and Hoffmann, Tammy C. and Ioannidis, John P. A. and Kahan, Brennan C. and Knowles, Rachel L. and Lamb, Sarah E. and Lewis, Steff and Loder, Elizabeth and Offringa, Martin and Ravaud, Philippe and Richards, Dawn P. and Rockhold, Frank W. and Schriger, David L. and Siegfried, Nandi L. and Staniszewska, Sophie and Taylor, Rod S. and Thabane, Lehana and Torgerson, David and Vohra, Sunita and White, Ian R. and Boutron, Isabelle}, title={{CONSORT 2025 explanation and elaboration: Updated guideline for reporting randomised trials}}, journal={BMJ}, year={2025}, volume={389}, eid={e081124}, doi={10.1136/bmj-2024-081124}}@article{kahan2012improper, author={Kahan, Brennan C. and Morris, Tim P.}, title={{Improper analysis of trials randomised using stratified blocks or minimisation}}, journal={Statistics in Medicine}, year={2012}, volume={31}, number={4}, pages={328--340}, doi={10.1002/sim.4431}}@article{kernan1999stratified, author={Kernan, Walter N. and Viscoli, Catherine M. and Makuch, Robert W. and Brass, Lawrence M. and Horwitz, Ralph I.}, title={{Stratified randomization for clinical trials}}, journal={Journal of Clinical Epidemiology}, year={1999}, volume={52}, number={1}, pages={19--26}, doi={10.1016/s0895-4356(98)00138-3}}@article{matsumoto1998mersenne, author={Matsumoto, Makoto and Nishimura, Takuji}, title={{Mersenne twister: A 623-dimensionally equidistributed uniform pseudo-random number generator}}, journal={ACM Transactions on Modeling and Computer Simulation}, year={1998}, volume={8}, number={1}, pages={3--30}, doi={10.1145/272991.272995}}@article{schulz2002generation, author={Schulz, Kenneth F. and Grimes, David A.}, title={{Generation of allocation sequences in randomised trials: Chance, not choice}}, journal={The Lancet}, year={2002}, volume={359}, number={9305}, pages={515--519}, doi={10.1016/s0140-6736(02)07683-3}}