鱼C论坛

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

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

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

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

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

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


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


if __name__ == "__main__":
    sample = {'小明': 10, '小红': 20, '小刚': 30, '小洋': 40, '小芳': 50}  # 数字是他们的权重
    result = dict([(x, 0) for x in sample.keys()])  # 存测试1000次结果
    for i in range(1000):
        kt = test()
        result[kt] += 1
    print(result)
想知道小甲鱼最近在做啥?请访问 -> 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.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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


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


if __name__ == "__main__":
    sample = {'小明': 10, '小红': 20, '小刚': 30, '小洋': 40, '小芳': 50}  # 数字是他们的权重
    result = dict([(x, 0) for x in sample.keys()])  # 存测试1000次结果
    for i in range(1000):
        kt = test()
        result[kt] += 1
    print(result)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

很好的想法!!!!我觉得已经接近成功了。
想知道小甲鱼最近在做啥?请访问 -> 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%这样的,就是这种处理方法容易有些人的概率一样,不公平
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我重新理解了一下,应该是抽奖一千次后谁的比重大,谁就是中奖者对吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

实在是太帅了!这个方法秒!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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


if __name__ == "__main__":
    sample = {'小明': 10, '小红': 20, '小刚': 30, '小洋': 40, '小芳': 50}  # 数字是他们的权重
    print(test())  # 不再验证,直接应用测试
3)另外力扣上题做多了,你会发现这种题并不难。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


不是概率,但是用法相当于是一个随机的抽奖了对吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

随机抽奖和权重抽选(选择)不是一个概念。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

是的,我的措辞不当,我想说的应该是,这个用法就相当于一个权重抽奖了对吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

对的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

太开心了~已经完美做出自己想要的效果了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 21:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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