随机数生成器
在线生成指定范围内的随机数,支持不重复抽样与结果排序,也能从名单里随机抽人,抽奖、点名、分组一次搞定
随机数生成器怎么用
- 选模式:抽数字用「数字范围」,从一堆名字里抽人用「名单抽取」。
- 数字范围模式:填最小值和最大值(比如 1 到 100),再填要生成几个。默认允许重复,像掷骰子一样每次独立;取消勾选就变成不重复抽样,适合抽签、抽号。
- 名单抽取模式:把候选名字粘进文本框,一行一个(逗号、顿号分隔也认),填抽取数量即可。默认抽后不放回,同一个人不会被抽中两次。
- 加排序(可选):勾选「结果排序」后输出会从小到大排列,方便贴进表格或核对。不勾选时保留生成顺序,抽奖场景用这个更有现场感。
- 复制结果:点「复制结果」,按你选的分隔符(逗号、空格、换行)粘贴到任何地方。
单次最多生成 1000 个数,抽取数量不能超过候选范围的大小——毕竟 1 到 50 之间只有 50 个不同的值,抽不出 100 个互不重复的结果。
计算机是怎么产生随机数的
严格来说,靠纯粹的算法算不出真正的随机数。给定一个初始值(种子)和一套固定的计算步骤,
得到的结果序列就是确定的——这类算法叫伪随机数发生器(PRNG)。
只要种子相同,跑出来的序列一模一样,而且序列终会循环。早期一些语言里的 rand(),
周期短到几万次就开始重复,用在仿真或抽样上会引入肉眼难辨的偏差。
要拿到不可预测的随机性,得从物理世界里"熵"。操作系统会持续收集键盘敲击的时间间隔、
鼠标移动的轨迹、磁盘中断的时刻、电路的热噪声,把这些噪声混合成一个熵池,
再由密码学安全的随机数发生器(CSPRNG)输出。浏览器的
crypto.getRandomValues() 走的就是这条路子,本工具的所有结果都由它产生——
看到前面若干个结果,无法推断出下一个。
取模偏差:一个容易被忽略的坑
很多生成随机数的代码是这样写的:Math.floor(Math.random() * max)。
问题在于,随机源的取值范围通常不能正好被 max 整除,多出来的那一小截会让排在前面的数字
出现概率略高于后面的。比如随机源能产生 0 到 9 共 10 个数,而你要的是 0 到 2 三个数,
用取余的方式映射,0 会对应到 0、3、6、9 四个值,而 1 和 2 只对应三个值——
0 出现的概率凭空高了三分之一。
生成密码、抽奖、抽签这类事上,这点偏差足以让结果不再公平。本工具用的是拒绝采样: 先划出一个能被候选数量整除的完整区间,落在区间外的随机值直接丢弃重来。 代价是多算几次,换来的是每个候选值被选中的概率严格相等。
为什么想要不重复的数字那么难
这背后是生日悖论。一个屋子里只要有 23 个人,其中两人生日相同的概率就超过一半—— 听起来违反直觉,因为一年有 365 天,23 个人似乎少得可怜。 关键在于比较的是"任意两人"的组合数,23 个人能凑出 253 对,每一对都是一次撞车机会。
换成随机数也一样:在 1 到 100 之间随机生成 20 个数,出现重复的概率大约 87%; 在 1 到 1000 之间生成 50 个数,重复概率约 71%。 粗略的规律是,当生成数量接近范围大小的平方根时,撞车就几乎不可避免。 所以做抽签、发号、分配不重复的任务时,记得把「允许重复」取消掉—— 工具会改用洗牌算法,从候选池里不放回地依次取出,保证结果两两不同。
随机数在这些地方派得上用场
- 抽奖与抽签:年会抽奖、门店活动、社群发福利,名单模式直接粘人名单,抽完即出结果,过程可当众操作。
- 课堂随机点名:把学生名单粘进去,每次抽一个,比按座位顺序点公平,学生注意力也更集中。
- A/B 测试分组:给候选用户编号后随机抽一半进实验组,保证分组不受人为偏好影响。
- 造测试数据:批量生成几千个在某个区间内的数值,用来压测接口、填充图表、验证统计逻辑。
- 游戏与桌游:掷骰子、抽卡牌、决定先手,省得找骰子,也不会有人怀疑你手气作弊。
- 日常决策:中午吃什么、谁去拿外卖、周末去哪儿,把选项列成名单抽一个,比纠结半天省时间。
关于随机,人们常犯的几个错
以为连续几次之后概率会"找补"回来。掷硬币连开五次正面,第六次出反面的概率依然是二分之一, 硬币没有记忆。这个错觉叫赌徒谬误,赌场里最常见的倾家荡产方式就是等"该出反面了"。
以为自己能凭空想出随机数。让人随口说一个 1 到 10 之间的数,选 7 的比例远高于十分之一; 让人随手画一串硬币正反序列,多数人会刻意避开连续三个相同的结果,可真正的随机序列里 连续三个相同相当常见。人脑天生在找规律,而规律正是随机的反面。
把"看起来乱"当成"分布均匀"。一堆挤在一起、分布不均的数字,未必比一个整齐的序列更随机。 判断随机性要看长期频率是否收敛到理论值,而不是看单次结果够不够乱。 反过来,一份结果如果过于均匀、毫无聚集,反而说明它可能是人为排出来的。
随机数生成器常见问题
生成的随机数真的随机吗?能被预测吗?
本工具使用浏览器内置的 crypto.getRandomValues() 接口,随机数来自操作系统收集的硬件噪声(键盘时序、鼠标轨迹、电路热噪声等),属于密码学安全随机数发生器,看到已生成的结果无法推断出下一个数。
它和 Math.random() 的区别在于:后者是伪随机算法,内部状态有限且算法公开,拿到足够多的连续输出后可以反推状态、预测后续结果。日常写个动画无所谓,用在抽奖或密码上就不合适了。
为什么不让我生成 100 个 1 到 50 之间的不重复数字?
不重复抽样的数量不能超过候选范围的总数。1 到 50 一共只有 50 个不同的值,自然抽不出 100 个互不相同的数。遇到这个提示,把最大值调大,或者勾选「允许重复」。
抽奖时先抽和后抽,中奖概率一样吗?
一样。工具采用洗牌算法一次性打乱候选池再依次取出,等价于把所有名字放进箱子里摇匀后按顺序抽取,每个位置被任意一个人抽中的概率完全相同,不存在先抽沾光或后抽吃亏。
可以用它来选彩票号码吗?
可以用它生成一组号码,但不会提高中奖概率。彩票每次开奖都是独立随机事件,机选、手选、看生日选、用随机数生成器选,中奖概率完全相同,历史上也没有任何一种选号方法能改变这一点。请量力而行,理性参与。
生成的结果会上传或保存吗?
不会。生成过程全部在你的浏览器里完成,页面不发送任何网络请求,结果也不会被保存,刷新页面即消失。名单模式下你粘贴的名字同样只停留在本页面,不会离开你的设备。
一次最多能生成多少个?名单有长度限制吗?
数字模式单次最多 1000 个,日常抽奖和测试数据足够用。名单模式没有硬性条数限制,名单规模主要受浏览器处理能力约束,几千行的名单可以正常处理。需要生成上万条数据时,建议分批进行。