鱼C论坛

 找回密码
 立即注册
查看: 2341|回复: 14

[已解决]自己想动手完成一个抽奖小程序遇到一点问题

[复制链接]
发表于 2021-11-1 11:32:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
随机性我知道怎么实现,但是我希望可以根据比重进行随机抽奖,谁比重大谁概率高,但是我查了random也没有这样的方法。
最佳答案
2021-11-1 13:57:55
Untitled.png
  1. import random


  2. def test():
  3.     global sample
  4.     s_sum = sum(sample.values())  # 权重和
  5.     r = random.randint(0, s_sum)  # 随机一个数
  6.     c_sum = 0
  7.     for k in sample.keys():
  8.         c_sum += sample[k]  # 当前权重梯度值
  9.         if r <= c_sum:  # 如果随机数小于当前权重梯度,说明在当前人的随机值,返回当前k
  10.             return k


  11. if __name__ == "__main__":
  12.     sample = {'小明': 10, '小红': 20, '小刚': 30, '小洋': 40, '小芳': 50}  # 数字是他们的权重
  13.     result = dict([(x, 0) for x in sample.keys()])  # 存测试1000次结果
  14.     for i in range(1000):
  15.         kt = test()
  16.         result[kt] += 1
  17.     print(result)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-11-1 12:26:55 | 显示全部楼层
你看看这个思路可以不
假设有a,b,c,a中奖的概率为70% b为20%,c为10%
那就可以random(10),a中奖的范围是1~7,b是8~9,而c要是10.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-1 12:37:33 | 显示全部楼层
这样可否:生成一个随机目标的列表,比重越大的目标,重复项越多,然后使用random.shuffle将列表打乱,再用random.choice从列表中选择目标。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-1 13:57:55 | 显示全部楼层    本楼为最佳答案   
Untitled.png
  1. import random


  2. def test():
  3.     global sample
  4.     s_sum = sum(sample.values())  # 权重和
  5.     r = random.randint(0, s_sum)  # 随机一个数
  6.     c_sum = 0
  7.     for k in sample.keys():
  8.         c_sum += sample[k]  # 当前权重梯度值
  9.         if r <= c_sum:  # 如果随机数小于当前权重梯度,说明在当前人的随机值,返回当前k
  10.             return k


  11. if __name__ == "__main__":
  12.     sample = {'小明': 10, '小红': 20, '小刚': 30, '小洋': 40, '小芳': 50}  # 数字是他们的权重
  13.     result = dict([(x, 0) for x in sample.keys()])  # 存测试1000次结果
  14.     for i in range(1000):
  15.         kt = test()
  16.         result[kt] += 1
  17.     print(result)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-1 16:23:42 | 显示全部楼层

你好,大神的代码对我有很大启发,有一个小问题想询问一下:这些代码的目的都是为了,计算出概率大小,但是没有进行随机的抽奖对吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-1 16:24:25 | 显示全部楼层
hrpzcf 发表于 2021-11-1 12:37
这样可否:生成一个随机目标的列表,比重越大的目标,重复项越多,然后使用random.shuffle将列表打乱,再用 ...

很好的想法!!!!我觉得已经接近成功了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-1 16:25:55 | 显示全部楼层
大马强 发表于 2021-11-1 12:26
你看看这个思路可以不
假设有a,b,c,a中奖的概率为70% b为20%,c为10%
那就可以random(10),a中奖的范围 ...

呜呜,我一开始的思路就是这样的,但是我有一点转不过弯,这里只能出现整数概率,不准确,我希望概率可以有53%、64%这样的,就是这种处理方法容易有些人的概率一样,不公平
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-1 16:27:26 | 显示全部楼层

我重新理解了一下,应该是抽奖一千次后谁的比重大,谁就是中奖者对吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-1 16:28:56 | 显示全部楼层

实在是太帅了!这个方法秒!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-1 17:09:28 | 显示全部楼层
W1ND123 发表于 2021-11-1 16:23
你好,大神的代码对我有很大启发,有一个小问题想询问一下:这些代码的目的都是为了,计算出概率大小,但 ...

1)不是计算概率,就是随机一个数,看他在哪个范围。属于哪个范围,那个范围的名称就是结果。比如上面的图,如果随机数落在70,它大于60,小于100,所以属于浅黄色。
2)测试1000次是为了验证函数是能够正常按照权重来随机抽选的,因为只测一次或少量次数,并不能看出我们设置的权重有没有效果。如果验证成功,可以直接使用。
  1. import random

  2. def test():
  3.     global sample
  4.     s_sum = sum(sample.values())  # 计算权重和
  5.     r = random.randint(0, s_sum)  # 随机一个数
  6.     c_sum = 0  # 当前权重和,配合图里就分别是:10,30,60,100,150
  7.     for k in sample.keys():
  8.         c_sum += sample[k]
  9.         if r <= c_sum:  # 如果随机数小于权重和,如随机数是70,小于100,那么就在黄色区域
  10.             return k  # 返回黄色区域的key


  11. if __name__ == "__main__":
  12.     sample = {'小明': 10, '小红': 20, '小刚': 30, '小洋': 40, '小芳': 50}  # 数字是他们的权重
  13.     print(test())  # 不再验证,直接应用测试

复制代码

3)另外力扣上题做多了,你会发现这种题并不难。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-1 18:46:32 | 显示全部楼层
本帖最后由 W1ND123 于 2021-11-1 18:48 编辑
suchocolate 发表于 2021-11-1 17:09
1)不是计算概率,就是随机一个数,看他在哪个范围。属于哪个范围,那个范围的名称就是结果。比如上面的 ...


不是概率,但是用法相当于是一个随机的抽奖了对吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-1 19:20:34 | 显示全部楼层
W1ND123 发表于 2021-11-1 18:46
不是概率,但是用法相当于是一个随机的抽奖了对吧

随机抽奖和权重抽选(选择)不是一个概念。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-1 20:38:06 | 显示全部楼层
suchocolate 发表于 2021-11-1 19:20
随机抽奖和权重抽选(选择)不是一个概念。

是的,我的措辞不当,我想说的应该是,这个用法就相当于一个权重抽奖了对吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-1 21:07:45 | 显示全部楼层
W1ND123 发表于 2021-11-1 20:38
是的,我的措辞不当,我想说的应该是,这个用法就相当于一个权重抽奖了对吧

对的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-1 21:13:56 | 显示全部楼层

太开心了~已经完美做出自己想要的效果了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-1 11:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表