W1ND123 发表于 2021-11-1 11:32:19

自己想动手完成一个抽奖小程序遇到一点问题

随机性我知道怎么实现,但是我希望可以根据比重进行随机抽奖,谁比重大谁概率高,但是我查了random也没有这样的方法。

大马强 发表于 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.

hrpzcf 发表于 2021-11-1 12:37:33

这样可否:生成一个随机目标的列表,比重越大的目标,重复项越多,然后使用random.shuffle将列表打乱,再用random.choice从列表中选择目标。

suchocolate 发表于 2021-11-1 13:57:55

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# 当前权重梯度值
      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 += 1
    print(result)

W1ND123 发表于 2021-11-1 16:23:42

suchocolate 发表于 2021-11-1 13:57


你好,大神的代码对我有很大启发,有一个小问题想询问一下:这些代码的目的都是为了,计算出概率大小,但是没有进行随机的抽奖对吗

W1ND123 发表于 2021-11-1 16:24:25

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

很好的想法!!!!我觉得已经接近成功了。

W1ND123 发表于 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%这样的,就是这种处理方法容易有些人的概率一样,不公平

W1ND123 发表于 2021-11-1 16:27:26

suchocolate 发表于 2021-11-1 13:57


我重新理解了一下,应该是抽奖一千次后谁的比重大,谁就是中奖者对吧

W1ND123 发表于 2021-11-1 16:28:56

suchocolate 发表于 2021-11-1 13:57


实在是太帅了!这个方法秒!

suchocolate 发表于 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
      if r <= c_sum:# 如果随机数小于权重和,如随机数是70,小于100,那么就在黄色区域
            return k# 返回黄色区域的key


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


3)另外力扣上题做多了,你会发现这种题并不难。

W1ND123 发表于 2021-11-1 18:46:32

本帖最后由 W1ND123 于 2021-11-1 18:48 编辑

suchocolate 发表于 2021-11-1 17:09
1)不是计算概率,就是随机一个数,看他在哪个范围。属于哪个范围,那个范围的名称就是结果。比如上面的 ...

不是概率,但是用法相当于是一个随机的抽奖了对吧

suchocolate 发表于 2021-11-1 19:20:34

W1ND123 发表于 2021-11-1 18:46
不是概率,但是用法相当于是一个随机的抽奖了对吧

随机抽奖和权重抽选(选择)不是一个概念。

W1ND123 发表于 2021-11-1 20:38:06

suchocolate 发表于 2021-11-1 19:20
随机抽奖和权重抽选(选择)不是一个概念。

是的,我的措辞不当,我想说的应该是,这个用法就相当于一个权重抽奖了对吧

suchocolate 发表于 2021-11-1 21:07:45

W1ND123 发表于 2021-11-1 20:38
是的,我的措辞不当,我想说的应该是,这个用法就相当于一个权重抽奖了对吧

对的

W1ND123 发表于 2021-11-1 21:13:56

suchocolate 发表于 2021-11-1 21:07
对的

太开心了~已经完美做出自己想要的效果了
页: [1]
查看完整版本: 自己想动手完成一个抽奖小程序遇到一点问题