随机选择器
"吃什么 / 看什么 / 去哪儿" · 支持权重 · 选择困难症神器
多选一/帮你下决定
"吃什么 / 看什么 / 去哪儿" · 支持权重 · 选择困难症神器
· 权重写法:每行 选项|权重,权重 1-100 · 例 火锅|3
· 算法:累积权重 + 二分查找。[3,2,1] → 50%/33%/17%
· 心理学技巧:结果出现时你的瞬间反应(满意 / 失望)已透露内心偏好 — 选择困难本质是不确定,结果帮你看清自己
了解工具定位 · 使用场景 · 对比优势
面对几个选项拿不定主意时,把选项列出来,让随机选择帮你做决定。适合午餐吃什么、周末去哪玩、抽签分组、活动抽奖等场景。输入选项,点一下按钮,结果立即出现。所有逻辑在浏览器内完成,选项数据不上传服务器。
下班后面对外卖 App 翻来翻去,三个人想吃火锅、日料、炒菜各执一词。将候选餐厅或菜系录入工具,一次随机抽取,省去 15 分钟无效讨论。抽到结果后全员接受,不伤和气,快速下单。
流媒体平台片单太长,两人各自想看的类型不同。把候选电影名输入工具,随机抽一部,避免各自刷简介半小时仍无法决定。抽中后直接播放,减少决策疲劳。
多人联机时队友纠结选哪个英雄/职业,拖慢开局。将候选角色列表录入工具,每人抽一个,强制随机分配。增加娱乐性,也避免因抢角色产生争执。
读书会成员各自推荐一本候选书,投票往往平局或少数人主导。将候选书目录入工具,随机抽取一本作为本月共读书目。公平、高效,且带来意外阅读体验。
线下聚会或线上群聊中需要公平抽奖,参与者名单已定。将名单逐条录入工具,点击抽取即可产生中奖者。过程透明可录屏,结果无争议。
| 维度 | 本工具 | 竞品 A(随机抽签器) | 传统方法 |
|---|---|---|---|
| 数据隐私 | 纯浏览器处理,零上传 | 上传至服务器进行随机 | 依赖人工或物理纸条 |
| 处理速度 | 即时(毫秒级) | 2-5 秒含网络延迟 | 数分钟至数小时 |
| 离线可用 | 完全离线 | 需要网络连接 | 完全离线 |
| 选项数量 | 无上限 | 通常限制 100 项 | 受物理空间限制 |
| 权重设置 | 暂不支持权重 | 支持自定义权重 | 可手动调整概率 |
| 结果可追溯 | 无历史记录 | 有历史记录功能 | 依赖人工记录 |
| 使用成本 | 免费 | 免费+高级版订阅 | 材料成本+时间成本 |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| 吃饭, 睡觉, 打豆豆 | 打豆豆 | 典型场景:日常琐事随机选择 |
| 火锅, 烧烤, 日料, 川菜, 粤菜, 西餐 | 日料 | 典型场景:多人聚餐时决定吃什么 |
| A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z | M | 边界 case:26 个字母全量输入 |
| 是, 否 | 是 | 边界 case:仅两个选项的二元选择 |
| 今天去跑步, 今天去游泳, 今天去爬山 | 今天去游泳 | 易错 case:用户重复了相同日期前缀 |
| 选项1, 选项2, 选项3, 选项4, 选项5, 选项6, 选项7, 选项8, 选项9, 选项10 | 选项8 | 边界 case:10 个选项的常规测试 |
| 红色, 蓝色, 绿色 | 蓝色 | 典型场景:颜色等简单属性随机选 |
吃饭,睡觉,打豆豆吃饭
睡觉
打豆豆工具按换行符(\n)分割选项;逗号会被当作一个完整选项,导致结果变成「吃饭,睡觉,打豆豆」而非三个独立项
吃饭
睡觉
打豆豆 吃饭
睡觉
打豆豆末尾空格会被视为选项的一部分,导致「吃饭 」与「吃饭」被视为不同选项,影响随机概率的公平性
吃饭
睡觉
打豆豆吃饭
睡觉
打豆豆连续换行产生的空行会被解析为一个空字符串选项,随机时可能抽到「空白」,用户误以为工具未响应
粘贴 10 万个选项(文本长达数 MB)选项数量控制在 1000 以内,总文本不超过 64KB浏览器 textarea 默认有 524288 字符限制(约 512KB),但大量选项会导致页面卡顿、随机算法性能下降
https://example.com/option1
https://example.com/option2选项1
选项2工具是纯文本随机选择,不会解析 URL;若需要从 URL 列表随机跳转,应使用专门的「随机跳转」工具
期望工具输出所有选项的随机排列(如抽签顺序)工具只输出一个结果;需要排列请使用「随机排序」或「抽签」工具本工具每次只随机返回一个选项,不保留历史记录,也不对选项列表进行重新排序
从 Word/Excel 直接复制文本,带不可见控制字符先粘贴到纯文本编辑器(记事本)再复制到工具富文本复制会携带零宽空格、BOM 等不可见字符,导致选项看似相同但实际不同,影响随机公平性
刷新页面后,上次的结果消失,用户以为出错了每次使用前手动记录或截图保存结果工具为纯前端实现,不存储任何数据到服务器或 localStorage;刷新页面会重置所有状态
公式推导 · 流程图解 · 依据出处
P(i) = 1 / n
P(i) — 每个选项被选中的概率n — 选项总数(≥2)午餐在 5 家店中随机选一家:n=5,每家被选中的概率 P = 1/5 = 0.2(20%)。工具内部使用 Fisher-Yates 洗牌算法或 CSPRNG 生成均匀分布随机数,确保每次选择独立且等概率。
适用于所有等概率随机选择场景(选项数 ≥2)。不适用于加权选择(如按权重分配概率)或伪随机序列(如游戏抽卡保底机制)。基于均匀分布随机数生成,无特定论文标准。
3 种主流语言 · 复制即用
import random
# 从列表中随机选择一个选项
options = ["吃饭", "睡觉", "打豆豆"]
choice = random.choice(options)
print(f"选择结果: {choice}")
# 带权重的随机选择
weighted_options = ["火锅", "烧烤", "日料"]
weights = [0.5, 0.3, 0.2] # 火锅50%概率
choice = random.choices(weighted_options, weights=weights, k=1)[0]
print(f"加权选择结果: {choice}")package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().UnixNano())
// 从切片中随机选择一个选项
options := []string{"看电影", "逛街", "打游戏"}
choice := options[rand.Intn(len(options))]
fmt.Printf("选择结果: %s\n", choice)
// 带权重的随机选择
type WeightedOption struct {
Name string
Weight int
}
weightedOptions := []WeightedOption{
{"奶茶", 50},
{"咖啡", 30},
{"果汁", 20},
}
totalWeight := 0
for _, opt := range weightedOptions {
totalWeight += opt.Weight
}
r := rand.Intn(totalWeight)
cumulative := 0
for _, opt := range weightedOptions {
cumulative += opt.Weight
if r < cumulative {
fmt.Printf("加权选择结果: %s\n", opt.Name)
break
}
}
}// 从数组中随机选择一个选项
const options = ["散步", "跑步", "游泳"];
const choice = options[Math.floor(Math.random() * options.length)];
console.log(`选择结果: ${choice}`);
// 带权重的随机选择
const weightedOptions = [
{ name: "火锅", weight: 50 },
{ name: "烧烤", weight: 30 },
{ name: "日料", weight: 20 }
];
function weightedRandom(items) {
const totalWeight = items.reduce((sum, item) => sum + item.weight, 0);
let random = Math.random() * totalWeight;
for (const item of items) {
random -= item.weight;
if (random <= 0) {
return item.name;
}
}
return items[items.length - 1].name;
}
console.log(`加权选择结果: ${weightedRandom(weightedOptions)}`);
// 排除已选项(不重复选择)
function selectWithoutRepeat(pool, exclude) {
const available = pool.filter(item => !exclude.includes(item));
if (available.length === 0) return null;
return available[Math.floor(Math.random() * available.length)];
}
const pool = ["A", "B", "C", "D"];
const alreadyChosen = ["A"];
const next = selectWithoutRepeat(pool, alreadyChosen);
console.log(`排除已选项后的选择: ${next}`);8 个高频疑问