【Python】ValueError:Sample larger than population or is negative 的原因
距离上次更新本文已经过去了 674 天,文章部分内容可能已经过时,请注意甄别
ValueError: Sample larger than population or is negative
的原因以及解决办法
1. 出现
这几天重构 kook-valorant-bot
的代码的时候,遇到了这个问题
plaintext
1 | Job "vip_roll_task (trigger: interval[0:01:20], next run at: 2023-01-25 19:59:21 CST)" raised an exception |
这部分代码是用来生成抽奖结果的随机数的,在网上百度了报错之后,得知是 random
生成随机数时产生的报错
2. 复现
找到对应的代码
python
1 | ran = random.sample(range(0, len(VipRollDcit[msg_id]['user'])-1), vnum) # 生成n个随机数 |
这个代码的作用是,生成 vnum
个从 0 到 len(VipRollDcit[msg_id]['user']) - 1
的随机数,不包含 len(VipRollDcit[msg_id]['user'])-1
咳咳,这里又发现了另外一个 bug:我以为是包含右边界的,所以手动
-1
了;现在导致最后一个参加抽奖的用户永远都抽不到奖了😥正确的 range 应该是
(0, len(VipRollDcit[msg_id]['user']))
但是,如果参与抽奖的人数少于 vnum
,就会出现上面的报错
python
1 | import random |
可以来简单测试一下,这里我想在 0 到 2 之间(其实就是 0,1
)生成 3 个随机数
plaintext
1 | $ py3 test1.py |
此时运行,就会有这样的报错。
因为这个写法的作用是在 0-2
之间产生不重复的随机数,你的目标数量都大于这个集合之中已有数据的数量了,那要怎么生成不重复的随机数呢?
3. 解决
解决办法很简单
- 右边界不能等于或者小于左边界
- 产生随机数的数量要小于边界之中数据的数量
比如上面的代码,我们修改一下边界,就能获得正确的结果
python
1 | import random |
运行
plaintext
1 | $ py3 test1.py |
对于我的抽奖代码而言,则需要重新操作一番。即可能出现奖品数量大于参与抽奖的人数的情况;
这时候就需要进行判断了
- 奖品数量少于抽奖人数,使用 random 生成随机数
- 奖品数量大于抽奖人数,抛弃多余奖品,直接生成一个从 0 到总人数的列表
- 奖品数量等于抽奖人数,上面两种情况都可以用
代码如下
python
1 | # 人数大于奖品数量 |
这时候就 ok 了,没有问题了
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 慕雪的寒舍!
评论
表情图片预览
0 条评论
- 最新
- 最热
- 最早
- 作者
关闭评论
通知中心
「此时无声胜有声」
Artalk ErrorTypeError: Failed to fetch,无法获取评论列表数据
点击重新获取 | 打开控制台
点击重新获取 | 打开控制台