Block Randomization

Author

SEOYEON CHOI

Published

March 26, 2026

Import

import random
import pandas as pd
def block_randomization_random_block_with_info(
    n_subjects,
    block_sizes=[4, 6],
    sequence=[1, 2],
    seed=123
):
    random.seed(seed)
    
    assignments = []
    block_ids = []
    block_sizes_used = []
    
    block_num = 1
    
    while len(assignments) < n_subjects:
        block_size = random.choice(block_sizes)
        n_per_sequence = block_size // len(sequence)
        
        block = []
        for seq in sequence:
            block.extend([seq] * n_per_sequence)
        
        random.shuffle(block)
        
        for seq in block:
            assignments.append(seq)
            block_ids.append(block_num)
            block_sizes_used.append(block_size)
        
        block_num += 1
    
    assignments = assignments[:n_subjects]
    block_ids = block_ids[:n_subjects]
    block_sizes_used = block_sizes_used[:n_subjects]
    
    df = pd.DataFrame({
        'Subject_ID': [f'SUBJID_{i+1:03d}' for i in range(n_subjects)],
        'Group': assignments,
        'Block': block_ids,
        'Block_Size': block_sizes_used
    })
    
    return df
df_rand = block_randomization_random_block_with_info(
    n_subjects=30,
    block_sizes=[4, 6],
    sequence=[1, 2],
    seed=2026
)
print(df_rand)
    Subject_ID  Group  Block  Block_Size
0   SUBJID_001      1      1           4
1   SUBJID_002      1      1           4
2   SUBJID_003      2      1           4
3   SUBJID_004      2      1           4
4   SUBJID_005      1      2           4
5   SUBJID_006      1      2           4
6   SUBJID_007      2      2           4
7   SUBJID_008      2      2           4
8   SUBJID_009      1      3           6
9   SUBJID_010      2      3           6
10  SUBJID_011      2      3           6
11  SUBJID_012      2      3           6
12  SUBJID_013      1      3           6
13  SUBJID_014      1      3           6
14  SUBJID_015      2      4           4
15  SUBJID_016      1      4           4
16  SUBJID_017      1      4           4
17  SUBJID_018      2      4           4
18  SUBJID_019      1      5           6
19  SUBJID_020      2      5           6
20  SUBJID_021      2      5           6
21  SUBJID_022      1      5           6
22  SUBJID_023      2      5           6
23  SUBJID_024      1      5           6
24  SUBJID_025      2      6           6
25  SUBJID_026      1      6           6
26  SUBJID_027      1      6           6
27  SUBJID_028      1      6           6
28  SUBJID_029      2      6           6
29  SUBJID_030      2      6           6
print(df_rand['Group'].value_counts())
1    15
2    15
Name: Group, dtype: int64