使用方法
- 在「抽取数量」里填 1 到 10 的整数,默认 5。填 0、11、小数或非数字都会被拦下并说明允许范围。
- 在「类型」里选不限或 8 个类型之一。各类型池大小不同:科幻 10 部,剧情 6 部,喜剧只有 1 部。
- 勾选「无放回」时同一批不重复;取消勾选则每次抽取独立进行,可能连续抽到同一部。
- 点「随机抽取」,或在数量输入框里按 Enter。结果区输出「中文名(英文名,年份,类型)」的列表。
- 概率对照表默认 12 行,点「加载更多」补齐 13 行;「导出 CSV」带 BOM 头,Excel 打开中文不乱码。
这个随机电影生成器能解决什么
观影夜选不出片子:设定类型和数量,一次抽出 5 部候选,直接投票,不用再翻片单来回纠结。
做观影挑战或影评作业要「不重复的抽样」:勾选无放回后,一批里的每一部都不同,抽走一部池子就少一部,这正是统计意义上的不放回抽样。
想理解「为什么我抽 10 部总有两部一样」:概率对照表给出有放回抽取下 k 从 1 到 13 的重复概率,10 部时是 70.67%,重复才是常态;勾上无放回就能归零。
要按类型控制候选:科幻池 10 部可以一次抽满 10 部,喜剧池只有 1 部,想抽 5 部会被直接提示不足,而不是悄悄用别的类型凑数。
本页只从内置的 40 部影片池抽取,不联网取片单、不按个人口味推荐,也不给评分。想从自己的列表里抽,用列表随机器或挑选随机赢家更合适;把一批人分成几组则属于随机队伍生成器的口径。
原理与规则说明
随机电影生成器默认用部分 Fisher–Yates 抽样实现无放回:把过滤后的池复制一份,for i = 0 到 k-1:j = i + floor(random() × (n − i)),交换 a[i] 与 a[j],最后取前 k 个。每个位置都是从「剩下的未选中元素」里等概率取一个,等价于不放回抽样,k 次抽取互不相同。
为什么不用 sort(() => Math.random() − 0.5) 洗牌:比较器返回随机值会破坏排序算法的前提。实测 n=3、12 万次里,排列 1,2,3 出现了 44885 次(理论 20000,偏差 +124.4%),排列 1,3,2 只有 7536 次(偏差 −62.3%),最大偏差 124.4%;同条件下 Fisher–Yates 的最大偏差是 0.9%。V8 的 sort 是 TimSort,随机比较器会让某些元素几乎不动。
随机源是 Math.random(),按 ECMAScript 规范它返回 [0,1) 的近似均匀数,规范未规定具体算法,也不适合密码学用途——需要密码学随机要用 crypto.getRandomValues()。对选电影这种场景,均匀性已经足够,本页实测 40 部各抽 20 万次,单部命中数在 4918 到 5193 之间,理论值 5000,相对偏差不超过 3.86%。
有放回与无放回的区别:有放回是 k 次独立均匀抽取,出现重复的概率是 1 − 40×39×…×(40−k+1) ÷ 40^k,抽 5 部时 22.89%、10 部时 70.67%;无放回直接为 0。勾选框切换的就是这两种抽样方式。
过滤再抽样:先按类型过滤出子池,再在子池上做无放回抽样。所以「无放回」的上限是子池大小而不是 40——喜剧只有 1 部,无放回抽 2 部就已经不可能,本页会在抽取前拦下并报出子池的实际数量。
完整示例(数值仅作演示)
默认设置(5 部、不限类型、无放回)打开页面就能看到一份真实输出:指环王:护戒使者(2001,冒险)、异形(1979,科幻)、布达佩斯大饭店(2014,喜剧)、搏击俱乐部(1999,剧情)、逃出绝命镇(2017,惊悚),五部互不重复,类型也各不相同。
切到「科幻」再抽 5 部:子池 10 部,占全池的 25%,抽出的每一部都是科幻片;无放回下最多能一次抽 10 部,第 11 部开始本页会报「科幻池只有 10 部」。
取消勾选「无放回」抽 10 部:出现重复的概率是 70.67%,也就是说十次里有七次能看到同一部出现两次以上;这不是 bug,是有放回抽样的正常表现。
把数量改成 1:单次抽取,有放回与无放回结果完全一样,都是 40 部里等概率取一部,单部命中率 2.5%。
输入范围与对照表
| 类型 | 池内片数 | 占全池 | 无放回单次上限 | 抽 10 部会怎样 |
|---|---|---|---|---|
| 不限 | 40 部 | 100% | 10 部(页面上限) | 正常抽出 |
| 科幻 | 10 部 | 25% | 10 部 | 正常抽出 |
| 剧情 | 6 部 | 15% | 6 部 | 提示不足 10 部 |
| 犯罪 | 5 部 | 12.5% | 5 部 | 提示不足 10 部 |
| 动画 | 5 部 | 12.5% | 5 部 | 提示不足 10 部 |
| 惊悚 | 5 部 | 12.5% | 5 部 | 提示不足 10 部 |
| 冒险 | 4 部 | 10% | 4 部 | 提示不足 10 部 |
| 爱情 | 4 部 | 10% | 4 部 | 提示不足 10 部 |
| 喜剧 | 1 部 | 2.5% | 1 部 | 提示不足 10 部 |
输入范围:数量 1 到 10 的整数,类型 9 选 1,无放回为可选勾选。池子固定 40 部,年份跨度 1942 到 2022,每部只标一个主类型。
常见误用对照:把「每次点都不同」当成无放回的承诺。无放回只保证同一批内不重复,两次点击之间是两次独立抽样,完全可能连续两批都抽到同一部。
输入范围、边界与精度说明
数量字段只收 1 到 10 的整数:Math.floor(输入) === 输入 不成立时(例如 5.5)提示不要带小数;0 或 11 以上提示允许范围;空框提示填数字。三种情况都不会静默改成默认值 5。
子池不足必须报错:无放回勾选时若子池片数小于抽取数量,本页报「类型 X 只有 N 部,无法无放回抽 M 部」,不会用重复片名或别的类型凑数。实测喜剧池 1 部时抽 10 部会被直接拦下。
均匀性实测:对 40 部各做 20 万次单抽,单部命中数最大 5193、最小 4918,理论值 5000,最大相对偏差 3.86%;k=5 的 20 万次试验里 40 部全部被抽到过,每部理论 25000 次,实测 24703 到 25237。偏差来自有限样本而不是算法偏置。
抽样用复制池:部分 Fisher–Yates 在池的副本上交换,原池数组不动,所以连续两次「随机抽取」的池子都是完整的 40 部(或子池),不会越抽越少。
重复概率是解析值不是模拟值:表中每个概率都按 1 − ∏(40−i)/40 逐步乘出来,保留两位小数,k=13 时 88.83%。它描述的是「至少两部相同」,不是「恰好一部出现两次」。
常见误用的正确解释:把 Math.random() 当密码学随机源是错的,规范只保证近似均匀、不可预测性无保证;本页用它抽电影没问题,但不要把同一段逻辑搬去生成令牌或密码。
常见问题
为什么取消无放回后会出现重复片名?
有放回抽样每次都是独立的均匀抽取,前一次的结果不影响后一次。40 部抽 10 部出现重复的概率是 70.67%,重复才是这种抽样方式的常态,想要不重复就勾上无放回。
片池是怎么定的?
内置 40 部 1942 到 2022 年间的公认经典,每部标一个主类型。它是固定清单,不联网更新,也不按你的观影记录调整。
能导入自己的片单吗?
本页不支持。自带片单的抽取请用列表随机器,它专门处理「用户粘贴任意列表再抽」的场景。
连续两次都抽到同一部,是不是坏了?
不是。两次点击是两次独立抽样,单部命中率 2.5%,连续两批抽到同一部并不罕见。真正需要「跨批不重复」要自己记住上一批结果,本页不做跨批状态。
为什么喜剧只能抽 1 部?
无放回的上限就是子池大小,喜剧池只有 1 部,第 2 部物理上不存在。想多抽就换不限类型,或取消无放回(但会出现重复)。
抽取结果有偏好顺序吗?
没有。Fisher–Yates 对每个排列等概率,实测最大偏差 0.9%;那些声称「顺序也代表排名」的用法是没有依据的。
这个随机源安全吗?
对选电影足够均匀,但不具备密码学强度。Math.random() 不该用于令牌、密码这类防预测场景,那需要 crypto.getRandomValues。
抽取记录会被上传吗?
不会。抽样只用 Math.random() 和数组交换,没有任何网络请求;可以在开发者工具的 Network 面板确认,页面加载后不会再发请求。
相关工具
随机电影生成器只做「从固定片池抽样」这一件事,随机相关的其它场景各有专门页面。