使用方法
- 先勾题型。默认「真心话」和「大冒险」两类都勾着,只玩一种就把另一个取消。题型决定从哪一组题库里抽题,两类都不勾时没有题可抽,工具会直接报错。
- 选尺度档。默认第 2 档「熟络」。三档对应不同的开放程度,开局前请把下面的分级说明念一遍,全员同意后再继续。
- 填本轮题数,默认 8 题,允许 1~20 的整数。上限不是写死的 20,而是当前候选池的容量:两类全勾时候选池 20 题,只勾一类时只有 10 题,最多就只能抽 10 题。
- 点「抽一整轮」,或者在题数输入框里直接敲 Enter。结果表按抽取顺序列出本轮题目,同一轮内不会出现两道一样的题。
- 题数超过 12 时表格先渲染前 12 行,点「加载更多」展开剩余部分;点「导出 CSV」下载带 BOM 的表格(Excel 双击不乱码),点「复制对照表」把整轮按制表符复制走,粘进备忘录或群里传着玩。
这个真心话大冒险生成器能解决什么问题
一是把「谁出题」交给程序。现实里最尴尬的环节往往不是答题,而是没人愿意出题——出的题要么太温和没人接,要么一下子过火而冷场。这里把题库提前写死并分级,你只需要选一个档位,剩下的由抽样算法决定,出题人不再承担「他是不是故意整我」的压力。
二是同一轮内绝不重复。手工从一张纸上抽题,抽到后面很容易重复抽到刚才那道,或者因为翻页顺序固定而总是那几道。本页用不放回抽样,同一轮里的每一道题都来自不同位置,重复概率被压到 0——这是构造决定的,不是「概率很低」。
三是尺度可控、边界说在前面。尺度档不是给题目贴标签,而是把「这一档大概会问到什么程度」先讲清楚,让每个人在开始前就知道自己会被问到哪一类问题。第 3 档默认不勾,需要全场一致同意才切换。
四是一次生成整轮,方便离线和传阅。手机传着玩时不必每轮都回到浏览器点一下:抽好一整轮导出 CSV,存进备忘录,断网也能照着念。
本页不做这些事:不随机选人(谁答哪道题由你们自己决定)、不做计时和计分、不保存历史局。想先随机点一个人出来,用「随机抽人」;想在陌生人局里先融化气氛,用「破冰提问」;想玩「你做过我没做过」这类举手游戏,用「我有你没有」。这些都在页面底部的相关工具里。
出题原理:分档题库、不放回抽样与拒绝采样
这个真心话大冒险生成器在算法上只做两件事:从一个大题库里裁剪出本轮的候选池,然后不放回地抽出 n 道题。
第一步是裁剪候选池。题库总量固定 60 题:题型(真心话 / 大冒险)× 尺度档(1 / 2 / 3)= 6 个格子,每格 10 题。你勾的题型和选的档位共同定位到其中 1 个或 2 个格子,把它们拼起来就是候选池:只勾一类是 10 题,两类全勾是 20 题。这也解释了为什么「本轮题数」的上限会随勾选变化,而不是写死的 20。
第二步是洗牌式不放回抽样。用的是 Fisher–Yates 的部分洗牌:对候选池从下标 0 开始遍历到 n−1,第 i 次从「i 到末尾」这个区间里随机取一个下标 j,交换第 i 位和第 j 位。循环跑满 n 次之后,数组的前 n 位就是本轮的题,而且天然两两不同——因为每次被选中的位置都在不断缩小的未选区间里,被选走的位置不会再进入下一轮随机区间。这就是「同轮不重复」的全部原理,不需要事后去重,也不需要 while 循环反复重抽。
第三步是随机数的均匀性。随机源是 crypto.getRandomValues(new Uint32Array(1)),一次拿一个 32 位无符号整数,取值范围 0~4294967295。拿到之后不能直接写 n % 20:因为 232 = 4294967296 不能被 20 整除,余数是 16,意味着下标 0~15 这 16 个题目各比下标 16~19 多一次被抽中的机会。所以本页先算接受上限 Math.floor(4294967296 / 20) * 20 = 4294967280,随机数落在 4294967280~4294967295 这 16 个取值上就丢弃重抽。只勾一类时上限是 Math.floor(4294967296 / 10) * 10 = 4294967290,丢弃 6 个取值。被丢弃的比例在 1.4×10-9 到 3.8×10-9 之间,也就是平均十亿次才重抽几次,代价可以忽略,换来的却是严格均匀的分布。
与「每次独立随机」的差别有多大。假设候选池 20 题、抽 8 题,如果每道题都独立随机(抽完放回),出现至少一道重复题的概率是 80.16%——也就是说按独立随机抽,大多数轮次都会撞题。改成不放回之后这个概率被压到 0。同时 8 道题的可选方案从 208 种(约 2.56×1010)收敛到 P(20,8) = 20×19×…×13 = 5079110400 种(约 5.08×109),方案数少了,但每一种都是「无重复」的合法方案。
尺度档的界定方式必须说清楚。尺度档是本页自定义的开放程度分级,不是任何国家标准或行业规范,因此它不构成对「什么问题可以问」的授权。第 1 档只包含公开信息类问题(最近喜欢的歌、最拿手的菜),第 2 档开始涉及轻微尴尬的个人经历与小型社死动作,第 3 档涉及情感经历、金钱数字和需要交出手机的动作。上表里每一档的边界都写明了,开局前必须让所有人看过并同意;任何人在任何一轮都有权说「跳过」,这是使用本页的前提,而不是可选项。
完整示例(数值仅作演示)
示例条件与页面打开时的默认值完全一致:尺度档 2(熟络)、真心话与大冒险两类全勾、本轮 8 题。此时候选池是档 2 的两格共 20 题。
- 候选池容量 20 题,本轮抽 8 题,同轮重复题 0 题;
- 本轮的合法抽法共
P(20,8) = 5079110400种,约 5.08×109 种; - 如果改成每道题独立随机(有放回),8 题里至少重复一道的概率是 80.16%;
- 如果只勾「真心话」一类,候选池降到 10 题,同一轮最多只能抽 10 题;
- 把尺度档从 2 换到 3,候选池容量不变(仍是 20 题),但题目内容整体换成第 3 档的那 20 题。
下面这 8 道就是默认条件下抽出的演示值,与上面结果表里的 8 行、以及下面「尺度档与题库容量对照表」中的第 2 档完全对得上:
| 序号 | 题型 | 尺度档 | 题目 |
|---|---|---|---|
| 1 | 真心话 | 熟络 | 你最近一次撒谎是为了什么? |
| 2 | 大冒险 | 熟络 | 发一条大家规定内容的朋友圈。 |
| 3 | 真心话 | 熟络 | 你花过最冤枉的一笔钱是多少? |
| 4 | 大冒险 | 熟络 | 让大家翻你相册往前 20 张。 |
| 5 | 真心话 | 熟络 | 你有没有背着朋友说他坏话? |
| 6 | 大冒险 | 熟络 | 用最不擅长的唱腔唱一首歌副歌。 |
| 7 | 真心话 | 熟络 | 你最近一次后悔的决定是什么? |
| 8 | 大冒险 | 熟络 | 让大家投票选你最像的动漫角色。 |
尺度档界定与题库容量对照表
题库是固定的 6 个格子,每格 10 题。下表把每一档的边界和容量写清楚;「候选池」是按你勾选的题型算出来的可抽题数,也就是「本轮题数」的真正上限。
| 尺度档 | 本档的界定(开局前需全员确认) | 真心话 | 大冒险 | 两类全勾候选池 | 本轮题数上限 |
|---|---|---|---|---|---|
| 1 · 暖场 | 只涉及公开信息与轻量动作:喜好、习惯、日常小事;动作类不涉及隐私、不用手机、不做身体接触。 | 10 | 10 | 20 题 | 20 题 |
| 2 · 熟络 | 涉及轻微尴尬的个人经历与小型社死动作:小金额、丢脸瞬间、需要发一条动态或念一句话;仍不涉及情感经历与财务明细。 | 10 | 10 | 20 题 | 20 题 |
| 3 · 放开 | 涉及情感经历、心理感受与需要交出手机的动作:暗恋、心动、恋爱史、账单总额;默认不勾,需全场一致同意才开启。 | 10 | 10 | 20 题 | 20 题 |
| 合计 | 6 个格子 × 10 题 | 30 | 30 | 60 题 | — |
下面这张表是「本轮题数」对应的抽法数量与有放回时的撞题概率,用来解释为什么不放回比「重复就重抽」更省事。候选池固定按两类全勾的 20 题计算:
| 本轮题数 n | 不放回抽法 P(20,n) | 有放回方案数 20n | 无重复方案占比 | 有放回时至少撞一题 |
|---|---|---|---|---|
| 8 题(默认) | 5.08×109 | 2.56×1010 | 19.84% | 80.16% |
| 12 题 | 6.03×1013 | 4.10×1015 | 1.47% | 99.91% |
| 16 题 | 1.01×1017 | 6.55×1020 | 0.02% | 99.999% |
| 20 题(上限) | 2.43×1018 | 1.05×1026 | 4.7×10-8% | ≈100% |
| 只勾一类,8 题 | 1.81×106 | 1.00×108 | 1.81% | 98.19% |
把最后两列放在一起看就明白了:「不重复」不是把方案变多,而是把方案里绝大多数带重复的那部分直接删掉。抽 20 题时,有放回会产生约 1.05×1026 种序列,其中只有 2.43×1018 种是无重复的,占比不到一亿分之一。如果靠「抽到重复就重抽」来兜底,题数越多命中率越低,抽到 20 题时几乎每一轮都要重抽很多次;用不放回抽样则一次成型。
输入范围、边界与舍入说明
下面这些不是「限制」,而是这个真心话大冒险生成器刻意设定的边界,知道它们能避免把本页当万能工具用:
- 尺度档只接受 1、2、3。下拉框里只有这三个值;如果被脚本或浏览器插件改成别的值(含小数、空值),工具会报错而不是默默按第 1 档处理。
- 本轮题数是 1~20 的整数。0 题、负数、小数和空值都会被拒绝。上限还受题型限制:只勾一类时候选池只有 10 题,此时填 11 以上会被拒绝,并提示你「把题型补成两类全勾才有 20 题」。注意这不是舍入问题,工具不会把你填的 15 悄悄改成 10,宁可报错也不给你一个和输入不一致的结果。
- 「在场人数」只用于提示,不参与抽题。它不改变任何一道题被抽中的概率,也不会把题目分配给具体的人——谁答哪道题由你们自己决定。允许 2~30 人。
- 同一轮不重复,跨轮可以重复。再点一次「抽一整轮」是全新的一次抽样,上一轮抽过的题会重新回到候选池。所以两轮之间出现同题是正常的;两轮完全相同的概率是
1/P(20,8) ≈ 1.97×10-10,实际不会遇到。 - 抽题不消耗题库。不存在「抽完 60 题就没题了」的情况,每一轮都从完整的候选池重新开始。想在一局里用遍所有题,靠连续抽很多轮是做不到的——这不是缺陷,而是「每轮独立均匀」的必然结果。
- 结果表首屏 12 行。题数 ≤12 时一次性全部渲染;13~20 题时先渲染前 12 行并出现「加载更多」,点一下补齐剩余行。这是为了不让首屏被一张超长表格撑满,与抽题结果本身无关——导出 CSV 和复制对照表拿到的始终是完整的整轮题目。
- CSV 带 BOM,复制的是 TSV。「导出 CSV」在文件开头写入了 U+FEFF,Excel 双击打开中文不会乱码;「复制对照表」复制的是制表符分隔文本,直接粘进 Excel 或备忘录都会自动分列。CSV 里题目字段用双引号包裹,题面中若出现双引号会按 CSV 规则写成两个双引号。
- 结果不联网、不上传。题库写死在页面里,抽样在浏览器内完成,没有任何网络请求。这也意味着第 3 档的题目同样会出现在 HTML 源码中,介意被提前看到的话,换一台设备出题即可。
常见问题
为什么同一轮里一定不会重复,而不是「重复概率很低」?
因为用的是不放回抽样:每次随机只在「还没被选走的那些位置」里进行,被选走的位置不会再进入随机区间。这是构造上的保证,不依赖概率大小,也不需要事后去重。相比之下,独立随机的做法抽 8 题就有 80.16% 的概率至少撞一题。
为什么填 15 题、只勾一类时会被拒绝?
只勾一类时候选池只有 10 题,从 10 道题里不放回地抽 15 道是不可能的。工具会明确报错并告诉你想抽 15 题必须把题型补成两类全勾(候选池 20 题),而不是悄悄把题数改成 10 塞给你一份和输入不符的结果。
尺度档是谁定的?有国标依据吗?
没有。尺度档是本页自定义的开放程度分级,用来在开局前把「这一档大概会问到什么程度」讲清楚,让每个人提前知道自己会遇到哪类问题。它不是授权,也不代表第 3 档的问题就一定适合你们这一场——是否开启、开到哪一档,必须由在场所有人共同决定。
抽到不想答的题怎么办?
跳过。这是本页的使用前提,不是可选礼貌:任何人在任何一轮都有权拒绝回答或拒绝执行,其他人不得追问原因。第 2、3 档里涉及社交媒体发布、翻看手机、联系他人的动作,尤其需要当事人自愿;工具只负责随机出题,不负责替你们判断某道题对某个人是否合适。
再点一次「抽一整轮」会和上一轮重复吗?
可能重复,而且是正常的。每一次点击都是独立的一次抽样,上一轮的题会重新回到候选池。两轮完全相同(顺序也相同)的概率约为 1.97×10-10,但两轮之间出现一两道相同的题属于随机现象,不代表算法出错。
为什么「在场人数」不参与抽题?
因为把题目分配给人是一个社交判断,不是一个计算问题:谁刚被罚过、谁特别害羞、谁今天不想被点,这些信息只有你们知道。本页只解决「这一轮出哪 8 道题」,人题对应关系留给你们自己安排。该字段只影响提示文案,填错也不会改变抽题结果。
导出的 CSV 用 Excel 打开是乱码吗?
不会。导出时在文件开头写了 UTF-8 BOM(U+FEFF),Excel 会据此识别编码,中文题目正常显示。「复制对照表」复制的是制表符分隔文本,粘进 Excel 会自动分列,粘进备忘录则保持对齐,两种方式都不需要手动设置编码。
题目会被上传,或者被其他人看到吗?
不会上传,但第 3 档的题目确实写在页面 HTML 里,懂技术的人查看源码就能提前看到全部 60 题。如果你在意被提前剧透,可以让一个人在自己的设备上出题,只把结果念出来;工具本身不做任何隐藏或加密。
相关工具
想让这个真心话大冒险生成器用在更具体的场合,可以按场景挑下面这些工具搭配: