实现 rnd():从基础随机数到可控随机

副标题 / 摘要 随机数生成是很多算法的基础。本文用线性同余法实现一个可复现的 rnd()。 目标读者 学习随机算法的开发者 需要理解 PRNG 的工程师 算法与系统基础学习者 背景 / 动机 大多数语言的随机数来自伪随机算法。 理解基础实现有助于评估随机性与可复现性。 核心概念 伪随机数(PRNG):由公式生成的序列 种子(Seed):决定序列起点 可复现性:同样种子产生相同序列 实践指南 / 步骤 选择线性同余参数 用种子初始化状态 每次调用更新状态并输出 将结果归一化到 [0,1) 可运行示例 class LCG: def __init__(self, seed=1): self.mod = 2 ** 31 self.a = 1103515245 self.c = 12345 self.state = seed def rnd(self): self.state = (self.a * self.state + self.c) % self.mod return self.state / self.mod if __name__ == "__main__": rng = LCG(seed=42) for _ in range(3): print(rng.rnd()) 解释与原理 线性同余法是最简单的 PRNG: state = (a * state + c) mod m。 它速度快,但随机性质量有限。 ...

2026年1月24日 · 1 分钟 · map[name:Jeanphilo]

随机迷宫生成:深度优先回溯法

副标题 / 摘要 随机迷宫生成常用深度优先回溯法。本文解释思路并提供可运行实现。 目标读者 学习图算法的开发者 想做程序化生成的工程师 算法入门学习者 背景 / 动机 迷宫生成是图遍历与随机化的经典结合。 它能帮助理解 DFS、回溯与边界处理。 核心概念 网格图:迷宫格点和通道 DFS 回溯:随机探索与回退 墙与通路:用字符表示结构 实践指南 / 步骤 初始化全墙网格 从起点开始 DFS 随机选择未访问邻居并打通墙 回溯直到全部访问完成 可运行示例 import random def maze(w, h): grid = [["#"] * (2 * w + 1) for _ in range(2 * h + 1)] visited = [[False] * w for _ in range(h)] def carve(x, y): visited[y][x] = True dirs = [(1, 0), (-1, 0), (0, 1), (0, -1)] random.shuffle(dirs) for dx, dy in dirs: nx, ny = x + dx, y + dy if 0 <= nx < w and 0 <= ny < h and not visited[ny][nx]: grid[y * 2 + 1 + dy][x * 2 + 1 + dx] = " " grid[y * 2 + 1][x * 2 + 1] = " " grid[ny * 2 + 1][nx * 2 + 1] = " " carve(nx, ny) carve(0, 0) return "\n".join("".join(row) for row in grid) if __name__ == "__main__": print(maze(6, 4)) 解释与原理 DFS 回溯保证每个格子被访问一次,随机方向带来多样性。 打通墙壁即可形成迷宫通路。 ...

2026年1月24日 · 1 分钟 · map[name:Jeanphilo]

随机生成不重复序列:洗牌法与采样法

副标题 / 摘要 生成不重复随机序列的标准方法是洗牌。本文说明原理并提供可运行实现。 目标读者 学习随机算法的开发者 需要抽样与随机化的工程师 算法面试准备者 背景 / 动机 随机且不重复是很多场景的基础能力,例如抽奖、打乱顺序、采样。 洗牌算法能保证均匀分布且复杂度可控。 核心概念 均匀随机:所有排列等概率 洗牌(Fisher-Yates):线性时间打乱 采样:在大规模集合中取子集 实践指南 / 步骤 初始化序列 从尾到头随机交换 保证每一步的随机性 输出最终序列 可运行示例 import random def shuffle(nums): for i in range(len(nums) - 1, 0, -1): j = random.randint(0, i) nums[i], nums[j] = nums[j], nums[i] return nums if __name__ == "__main__": nums = list(range(1, 11)) print(shuffle(nums)) 解释与原理 Fisher-Yates 在第 i 步随机选择 [0..i] 中的元素交换。 这样可保证所有排列等概率出现。 常见问题与注意事项 能否用 sort + random key? 不建议,分布不一定均匀。 是否需要固定随机种子? 测试时建议固定,生产可随机。 ...

2026年1月24日 · 1 分钟 · map[name:Jeanphilo]