【Python】ValueError:Sample larger than population or is negative的原因

ValueError: Sample larger than population or is negative的原因以及解决办法
1.出现
这几天重构kook-valorant-bot的代码的时候,遇到了这个问题
折叠代码块
复制代码
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个随机数
折叠代码块
复制代码
1 | $ py3 test1.py |
此时运行,就会有这样的报错。
因为这个写法的作用是在0-2之间产生不重复的随机数,你的目标数量都大于这个集合之中已有数据的数量了,那要怎么生成不重复的随机数呢?
3.解决
解决办法很简单
- 右边界不能等于或者小于左边界
- 产生随机数的数量要小于边界之中数据的数量
比如上面的代码,我们修改一下边界,就能获得正确的结果
折叠代码块PYTHON
复制代码
1 | import random |
运行
折叠代码块
复制代码
1 | $ py3 test1.py |
对于我的抽奖代码而言,则需要重新操作一番。即可能出现奖品数量大于参与抽奖的人数的情况;
这时候就需要进行判断了
- 奖品数量少于抽奖人数,使用random生成随机数
- 奖品数量大于抽奖人数,抛弃多余奖品,直接生成一个从0到总人数的列表
- 奖品数量等于抽奖人数,上面两种情况都可以用
代码如下
折叠代码块PYTHON
复制代码
1 | # 人数大于奖品数量 |
这时候就ok了,没有问题了
- 本文标题:【Python】ValueError:Sample larger than population or is negative的原因
- 创建时间:2023-01-26 08:47:19
- 本文链接:https://keep-hexo.musnow.top/posts/2918276452/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
复制版权信息