项目背景
在统计学、数据分析、机器学习以及计量经济学等领域中,列联表(Contingency Table) 是一种极其基础但又非常重要的数据结构。它用于描述两个或多个分类变量之间的联合分布关系,在以下场景中被广泛使用:
- 卡方独立性检验(Chi-square Test of Independence)
- Fisher 精确检验
- 多项分布建模
- 统计仿真与蒙特卡洛实验
- 离散概率模型的教学与验证
在实际工程或科研中,我们经常需要随机生成一个满足特定约束条件的 R×C 列联表,用于仿真、测试或算法验证。
例如:
- 随机生成样本数据,验证统计检验代码是否正确
- 模拟不同类别频数下的统计显著性
- 作为 Monte Carlo 方法中的随机输入
- 构造压力测试数据(极端稀疏 / 极端集中)
1.1 什么是列联表?
列联表是展示分类变量频数分布的矩阵形式。
1.2 '随机生成'的工程含义
'随机生成一个列联表'并不是一个唯一问题,而是一类问题,常见需求包括:
- 无约束随机生成
- 固定总样本量 N
- 固定行和
- 固定行和 + 列和(最复杂)
- 按概率分布生成(多项分布)
本项目聚焦最基础、最通用、教学最友好的一种形式:
在给定 R、C 以及总样本量 N 的前提下,随机生成一个 R×C 列联表,使所有单元格非负整数且总和为 N。
该模型是后续所有复杂列联表生成算法的基础。
项目需求
2.1 功能性需求
本项目需要实现:
- 一个通用接口,用于随机生成 R×C 列联表
- 支持输入参数:行数 R、列数 C、总样本量 N
- 输出:一个 R×C 的二维整数矩阵,所有元素 ≥ 0,所有元素之和 = N
接口示例:
std::vector<std::vector<int>> generateContingencyTable(int R, int C, int N);
2.2 非功能性需求
- 不依赖第三方统计库
- 使用标准 C++ 随机数设施
- 实现清晰,逻辑可解释
- 可重复(支持随机种子)
- 适合教学与博客展示
2.3 使用场景举例
- 单元测试统计分布代码
- Monte Carlo 模拟
- 教学中演示卡方检验
- 生成对抗性测试数据
- 算法竞赛中的随机数据构造
技术选型与策略
3.1 相关技术
主要涉及 C++ 标准库中的随机数设施及向量容器操作。
3.2 常见生成策略对比
| 方法 | 特点 | 是否适合教学 |
|---|---|---|
| 直接拒绝采样 | 简单但低效 | ❌ |
| 多项分布 | 偏概率建模 | ⚠ |
| 逐格分配 | 易理解 | ✅ |
| Stars and Bars | 数学优雅 | ⚠ |

