使用方法
- 先选「题目主题」。默认是「全部主题混合(24 组)」,也就是从整个题库里抽;也可以只挑一个主题,比如「超能力(4 组)」。
- 在「生成条数」里填本次想要几题,示例 6。合法范围是 1 到 24,超过题库规模一定重复,所以会被拦住。
- 点「生成题目」,结果区给出编号列表,每题格式是「A 还是 B?(主题)」;页面打开时已经预置了 6 组示例,直接就能用。
- 结果不满意再点一次即可,每次都是独立的一次洗牌。想回到初始那 6 题,点「载入示例」。
- 「复制结果」把整段题目写进剪贴板;「导出题库 CSV」下载带 BOM 的 24 行题库;「复制题库 TSV」复制成制表符文本,可直接粘进表格软件。
- 「加载更多」把对照表从 12 行展开到 24 行,方便先看看全部题目再决定主题。
这个宁愿两难问题生成器能解决什么问题
最常见的场景是破冰与聚会。饭桌上、团建里需要一连串「二选一」话题来热场,临时想题容易冷场;把条数设成 10,一次拿十条互不重复的题目连续抛出去,节奏就不会断。
第二类是内容创作选题。短视频、图文、播客都需要「宁愿 A 还是 B」这种高评论率的互动题,先随机抽 12 条当候选,再从中挑出最贴合账号调性的几条来二次加工。
第三类是自我问答与心理测试。这类题的价值不在答案本身,而在逼你把模糊的偏好排序;同一个主题连续抽几题,很快就能看出自己在「时间」「金钱」「能力」之间真正的权重。
这个宁愿两难问题生成器 不做的事也说清楚:它不判断哪个选项更「正确」,也不记录你的选择,因此不产出任何测试结论;它不做多人投票统计(那是问卷类工具的活);题库是固定的 24 组,不联网抓取,所以不会随着热点更新。
原理与规则说明
抽题用的是 Fisher–Yates 部分洗牌(也叫 Knuth shuffle)。做法是把题库 24 个下标放进一个数组,从末尾往前遍历,每次在「当前位置及之前」随机取一个下标并与当前位置交换;只要做 k 次就得到 k 个随机且互不重复的下标,无需把整个数组洗完。这个算法的关键在于「随机取值范围随当前位置收缩」——少了这一步,各个排列的出现概率就不再相等。
本页不用 sort(() => Math.random() - 0.5) 这种一行洗牌。它的比较函数不满足传递性,结果是有偏的:某些排列出现得更频繁,某些几乎不会出现。24 个元素做那种「洗牌」时,偏离均匀的程度已经可以用统计检验量出来;题目少了看不出来,抽多了就会发现总绕不开某几组。
随机源用的是浏览器的 Math.random()。它是伪随机数生成器而不是加密级随机源:以 V8 为例,底层是 xorshift128+,内部状态 128 位、周期约 2 的 128 次方减一,配合约 53 位的双精度输出。对抽话题这种用途足够,但它的输出在知道内部状态后可被预测,因此不能用于抽奖、密钥、验证码这类需要不可预测性的场合——需要那种强度时要改用 crypto.getRandomValues()。
第二层随机是左右换位。题库里每一组题都以固定的「A / B」顺序存储,如果直接输出,用户看到的永远是同一个选项在左边,久了会形成「左边那个总是更诱人」的错觉。所以生成时对每一题独立做一次 Math.random() < 0.5 的判定来决定是否交换左右,每题两种朝向,6 题就有 2 的 6 次方等于 64 种朝向组合。
组合数与去重的收益也可以量化:从 24 组题库里挑 6 组,不重复的组合数是 C(24,6) = 134596;如果允许重复抽同一组,可能的序列数是 24 的 6 次方 = 191102976,是前者的约 1419.8 倍。换句话说,去重把「看起来很多」的重复序列压缩成了真正互不相同的 13 万多种题面。
完整示例(数值仅作演示)
默认设置是主题「全部主题混合」、条数 6,与页面打开时预置的 6 题、以及下方题库表的前 6 行三处一致。
- 第 1 题出自「生活日常」:每天早起一小时 还是 每天晚睡一小时;
- 第 2 题同样出自生活日常:永远不能喝咖啡 还是 永远不能喝茶;
- 第 3、4 题继续用生活日常池,分别是手洗衣物 / 手洗餐具、手机 10% / 电脑 10%;
- 第 5、6 题进入「旅行冒险」池:环游世界一年 / 住五星酒店一年,坐火车 / 坐飞机。
这次抽到的 6 题全部来自前两个主题,看起来「不够散」,但这正是随机洗牌的正常结果之一:24 组里前 8 组恰好是生活日常与旅行冒险各 4 组,部分洗牌只取前 6 个位置,落在这 8 组里的概率并不低。想强制每个主题都出现,就手动把主题切换成单个主题,或者多抽几题(比如 12 题)提高覆盖面。
再看一条边界示例:把条数填成 24 会刚好用尽整个题库,输出 24 条互不重复的题目;填 25 则会被拒绝并提示「题库只有 24 组,超过必然重复」。如果只选了「超能力」这个主题,池子只有 4 组,条数填 6 会提示该主题最多只能出 4 条。
输入范围与对照表
两个控件都很简单:主题是下拉选择,条数接受 1 到 24 的整数。下面这张表是完整题库,24 组按 6 个主题分组,每组 4 条;页面默认直出前 12 组,「加载更多」补齐剩下 12 组。
| 主题 | 组数 | 可选范围 | 说明 |
|---|---|---|---|
| 生活日常 | 4 | 1 ~ 4 | 作息、饮品、家务、电量 |
| 旅行冒险 | 4 | 1 ~ 4 | 目的地、交通、住处、行程密度 |
| 超能力 | 4 | 1 ~ 4 | 语言、乐器、隐身、读心 |
| 食物口味 | 4 | 1 ~ 4 | 甜辣、外食、主食、餐数 |
| 假设场景 | 4 | 1 ~ 4 | 时间、金钱、断网、被记住 |
| 人际社交 | 4 | 1 ~ 4 | 朋友数量、说话方式、聚会角色 |
| 全部混合 | 24 | 1 ~ 24 | 六个主题合并后的全库 |
点「导出题库 CSV」得到 24 行明细(带 BOM,Excel 打开不乱码),点「复制题库 TSV」复制成制表符文本;两者都以当前表格内容为准,「加载更多」展开后导出的是完整 24 行。
输入范围、边界与精度说明
条数的合法区间是 1 到 24,且必须是整数。填 0、负数、小数、空值各有独立文案:0 与负数会被提示「要在 1 到 24 之间」,小数会被提示「要填整数」,空白会被提示「不能留空」。之所以不自动四舍五入,是因为「抽 6.5 题」本身没有定义,静默取整会让你误以为设置生效了。
主题决定了池子上限:选「全部主题混合」时最多 24 条,任意单主题最多 4 条。条数超过上限会被拒绝并明确指出是哪个主题、上限是多少,而不是悄悄少生成几条。
这里存在两个容易混淆的边界。其一是「不重复」的范围:本页保证的是同一次生成内部不重复;连续点两次「生成题目」,两次之间可能抽到相同的题,这属于设计而非缺陷——两次生成是两次独立抽样,不做跨次去重。其二是「随机」的含义:由于使用 Math.random(),结果无法被预测,也无法被复现;本页不提供种子(seed)输入,因此不要用它做需要可复现的实验。
性能上没有任何压力:即使一次生成 24 条,也只是对长度 24 的数组做 24 次交换,再加上 24 次左右朝向判定,总共几十次随机调用,耗时在微秒级。真正的限制只来自题库规模——题库固定为 24 组,想在 24 组之外出题,需要先扩充题库。
三条常见误用:把「随机抽 6 题」理解成「每个主题各抽 1 题」——本页混合模式是均匀抽,不保证主题均衡;以为连点两次不会出现重复题——跨次不保证;把生成结果当成心理测评结论——题面是固定的,结论取决于你自己怎么答。
常见问题
为什么连点两次「生成题目」会看到重复的题?
去重只发生在同一次生成内部。两次生成是两次独立的随机抽样,从 24 组里各抽 6 组,出现重叠几乎是必然的:单次 6 组的组合数有 134596 种,两次抽样完全不相交的概率并不高。
为什么不保证每个主题都出现?
混合模式是在 24 组上做均匀洗牌,不按主题配额分配,所以某一次抽到的 6 题可能集中在同一两个主题。要强制覆盖,请改用「主题」下拉框逐主题生成,或者把条数调大。
结果可以被复现吗?
不能。本页使用 Math.random(),没有种子输入,同一台设备连续两次结果也不同。需要可复现的随机,得改用带种子的伪随机算法,那不属于本页的用途。
为什么不用一行 sort 洗牌?
因为 sort(() => Math.random() - 0.5) 的随机比较函数违反传递性,得到的排列概率不均匀,属于有偏洗牌。本页改用 Fisher–Yates,逐位收缩随机范围,保证每个组合等概率。
最多能生成多少题?
全部主题混合时最多 24 题,刚好用尽题库;任意单主题最多 4 题。超过上限会被明确拦下,而不是少给几条。
左右两个选项的位置是固定的吗?
不是。每一题都独立判定一次是否交换左右,所以同一个「A / B」组合这次可能是 A 在前、下次可能 B 在前,用来消除「左边总更诱人」的位置偏差。选项内容本身不会被改写。
题库会联网更新吗?
不会。24 组题目随页面一起加载,全部在本地内存里洗牌,没有任何网络请求;开发者工具的 Network 面板里除了页面自身资源不会有新请求。
这些题能直接商用吗?
题面是通用的话题句式,不涉及第三方素材,但用于广告或出版物时请自行核查是否符合发布平台的规则;生成结果本身不包含任何个人数据。
相关工具
宁愿两难问题生成器 专注「二选一难题」这一种提问句式,相邻的话题与随机工具各有专门页面。