>백엔드 개발 >파이썬 튜토리얼 >Python으로 복권 시스템을 구현하는 방법

Python으로 복권 시스템을 구현하는 방법

王林
王林앞으로
2023-05-11 09:16:055485검색

    1. 기사 주제

    관련 복권 사기 신고를 보고도 무슨 일이 일어나고 있는지 이해하지 못하는 사람들이 있습니다. 복권에 의한 사기를 방지하기 위해 몇 가지 간단한 예를 사용하여 복권의 더 깊은 논리를 설명함으로써 모든 사람이 복권 뒤에 무엇이 숨겨져 있는지 직관적으로 확인하고 속는 것을 방지할 수 있습니다.

    2. 복권 디자인 아이디어

    먼저 간단한 복권 논리를 구현해 보겠습니다. 각 경품의 확률을 결정하고 확률에 따라 추첨해야 합니다.

    1단계: 요구 사항

    상품 목록이 있습니다. 각 상품에는 해당 확률이 있습니다. 사용자는 상품을 추첨하여 해당 확률에 맞는 상품을 획득합니다.

    2단계: 상품 목록 만들기

    위 요구 사항에 따라 해당 상품 테이블을 생성합니다. 확률은 1에서 100 사이의 정수를 선택합니다. 물론 0~1도 선택할 수 있습니다.

    # 奖品列表和对应的概率,和为100
    prizes = {"一等奖": 10,"二等奖": 20,"三等奖": 30,"参与奖": 40 }

    3단계: 확률 구현

    기본 복권 논리입니다. 코드 구현의 어려움은 주로 확률을 구현하고 상품을 추첨하는 방법입니다.

    확률에 관해서는 Random 모듈을 사용해야 합니다. 즉, 난수를 사용해야 한다는 뜻입니다. 여기에서 선택할 수 있는 두 가지 방법이 있습니다.

    첫 번째 방법: 간격을 통한 구현

    복권 확률은 간격으로 구현되며, 추첨 확률은 여러 간격으로 나누어지며 각 간격은 경품에 해당하며 그 범위에 따라 당첨 간격이 결정됩니다. 난수의. 예를 들어 복권의 확률을 다음과 같은 간격으로 나눌 수 있습니다.

    • - 간격 1: 0%~20%, 상금 A에 해당

    • - 간격 2: 20%~50%, 상금 A에 해당 경품 B

    • - 간격 3: 50%~80%, 경품 C

    • - 간격 4: 80%~100%, 경품 D

    사용자가 추첨을 하면, 0~100 사이의 난수 값을 생성한 후, 난수의 간격에 따라 당첨금을 결정할 수 있습니다. 예를 들어 생성된 난수가 35인 경우 당첨 간격은 B 상품에 해당하는 2가 됩니다.

    장점: 이러한 방식으로 복권 확률을 구현하면 각 경품의 당첨 확률을 유연하게 제어할 수 있고 실제 상황에 따라 조정할 수도 있다는 장점이 있습니다.

    단점: 각 상품의 당첨 확률의 합은 100%와 같아야 합니다. 그렇지 않으면 복권 결과가 부정확해집니다.

    import random
     
    # 奖品列表和对应的概率
    prizes = {"一等奖":10,"二等奖":20,"三等奖":30,"参与奖":40}
    #我们可以看做:
    # 一等奖:(0,10]
    # 二等奖:(10,30]
    # 三等奖:(30,60]
    # 参与奖:(60,100]
     
    # 抽奖函数
    def lottery():
        # 生成一个1~100之间的随机数
        lucky_number = random.randint(0,100)
        # 初始化区间值和奖品名称
        prob_sum_start = 0
        prob_sum_end = 0
        prize_name = None
     
        # 遍历奖品列表
        for name, prob in prizes.items():
            # 累加后一个区间值
            prob_sum_end += prob
            # 如果随机数在计算区间内,则中奖
            if prob_sum_start<lucky_number <= prob_sum_end:
                prize_name = name
                break
    # 累加前一个区间值
            prob_sum_start = prob
        #返回随机值和中奖产品
        return lucky_number,prize_name
    두 번째: 당첨 확률의 누적을 통해 실현

    확률 누적을 통해 복권을 구현할 수 있습니다. 먼저 이 복권의 결과를 나타내기 위해 1에서 100 사이의 난수를 생성합니다.

    그런 다음 누적 결과가 난수 이상이 될 때까지 상품 확률에 따라 보상이 순차적으로 누적됩니다.

    더 이상 누적되지 않는 마지막 상품 확률은 이번 추첨에서 획득한 상품입니다.

    예를 들어 난수가 50인 경우 확률 누적 방식에 따라 다음과 같은 결과를 얻을 수 있습니다.

    # 奖品列表和对应的概率,和为100
    prizes = {"一等奖": 10,"二等奖": 20,"三等奖": 30,"参与奖": 40 }

    10< 1등이 아님

    10 + 20 = 30 < 2등상

    10 + 20 + 30 = 60 >= 50, 즉 3등상입니다.

    따라서 이번 추첨에서 당첨된 상품은 3등 상품입니다.

    장점: 경품 확률을 유연하게 조정하여 다양한 복권 효과를 얻을 수 있습니다. 이 방법은 여러 상품에도 적용할 수 있으며, 해당 확률에 따라 누적되기만 하면 됩니다. 이해하기 쉽고 구현하기 쉽습니다.

    단점: 각 경품의 누적 확률을 계산해야 한다는 단점이 있습니다. 경품 개수가 많으면 계산 금액이 커질 수 있습니다.

    import random
     
    # 奖品列表和对应的概率
    prizes = {"一等奖": 10, "二等奖": 20, "三等奖": 30, "参与奖": 40}
     
     
    # 抽奖函数
    def lottery():
        # 生成一个1~100之间的随机数
        lucky_number = random.randint(1, 100)
        print(lucky_number)
        # 初始化概率总和和奖品名称
        prob_sum = 0
        prize_name = None
     
        # 遍历奖品列表
        for name, prob in prizes.items():
            # 累加概率总和
            prob_sum += prob
            # 如果随机数小于等于概率总和,则中奖
            if lucky_number <= prob_sum:
                prize_name = name
                break
        return prize_name

    4단계: 특별한 메커니즘 추가

    특정 활동이나 특정 추첨에 참여하고 나면 우리는 항상 큰 상품에 유혹을 받고 푹 빠질 것입니다. 이 문제는 해결될 수 있습니다. 이전에는 설정된 상금 확률에 따라 각 상품을 추첨할 수 있었습니다. 이때 몇 가지 특별한 메커니즘을 추가해야 합니다. 이러한 메커니즘은 "사기"를 위한 메커니즘, 즉 "알선"을 위한 메커니즘입니다.

    첫 번째: 상을 받고 싶은 사람이 상을 받게 하세요.

    이 방법은 주로 파티 장난 행사에 사용됩니다. 이런 일은 온라인에서 하면 안 되기 때문입니다. 당신은 복권을 모르나요? 누가 그 프로그램을 만들었나요?

    이 방법을 위해서는 화이트리스트를 추가해야 합니다. 화이트리스트에 있는 사람으로 판단되면 지정 경품을 심도록 하겠습니다.

    코드는 다음과 같습니다:

    import random
     
    # 奖品列表和对应的概率
    prizes = {"一等奖": 10, "二等奖": 20, "三等奖": 30, "参与奖": 40}
    #白名单列表
    whitelist = ["Tom", "Jerry", "Lucy"]
    # 抽奖函数
    def lottery(white_user):
        # 生成一个1~100之间的随机数
        lucky_number = random.randint(1, 100)
        print(lucky_number)
        # 初始化概率总和和奖品名称
        prob_sum = 0
        prize_name = None
        
        #判断在白名单内,中一等奖
        if white_user in whitelist:
            return "恭喜您中一等奖"
            # 遍历奖品列表
        else:
            for name, prob in prizes.items():
                # 累加概率总和
                prob_sum += prob
                # 如果随机数小于等于概率总和,则中奖
                if lucky_number <= prob_sum:
                    prize_name = name
                    break
        return prize_name
    두 번째 유형: 다른 활동에 참여한 후에만 복권에 참여할 수 있습니다.

    이 방법은 자격 확인을 추가하거나, 자격 증명을 추가한 후에만 복권에 참여할 수 있습니다. 일부 보안 제한 사항이 추가된 것으로 간주되는 사용자 정보가 있습니다.

    사용자가 다른 활동에 참여하거나 로그인하면 해당 활동에 참여하고 활동 프로세스에 들어갈 수 있습니다.

    코드는 다음과 같습니다.

    import random
     
    # 奖品列表和对应的概率
    prizes = {"一等奖": 10, "二等奖": 20, "三等奖": 30, "参与奖": 40}
    #已参加另外一个活动列表
    active_user = []
     
    #加法活动
    def addition(name):
        active_user.append(name)
        return name+"参加了活动"
     
     
    # 抽奖函数
    def lottery(name):
        # 生成一个1~100之间的随机数
        lucky_number = random.randint(1, 100)
     
        # 初始化概率总和和奖品名称
        prob_sum = 0
        prize_name = None
     
        # 判断在白名单内,中一等奖
        if name not in active_user:
            return "很抱歉,您没有资格参与活动"
     
        else:
            # 遍历奖品列表
            for name, prob in prizes.items():
                # 累加概率总和
                prob_sum += prob
                # 如果随机数小于等于概率总和,则中奖
                if lucky_number <= prob_sum:
                    prize_name = name
                    break
        return prize_name
     
    #测试一下
    print(lottery("Tom"))#如果没有参与加法活动,来参与,无法抽奖
    print(addition("Tom"))#Tom先来参与加法活动再去参与活动
    print(lottery("Tom"))#参与活动抽奖
    세 번째 유형: 때려죽여도 이기게 놔두지 않습니다

    이런 행위는 순전히 역겨운 사람들이 하는 행위이지만 참여하는 모든 유저들은 전혀 모르고 그것이 자신의 불운이라고 생각할 것입니다. 최우수상이 있지만 얻을 수는 없습니다.

    이것은 확률을 사용하지 않고 직접 결과를 제공하는 것이 그의 마케팅 방법입니다.

    코드가...만큼 좋지 않다면 필요하지 않으니 그냥 반품하세요.

    第四种:概率都是百分比,但是效果不一样

    这种就需要和我们设置的随机范围撤上关系,我们的随机范围是1-100,比例为百分比1-100的整数,但是当我们加上小数之后,就不一样。比如:

    1%和1.00%

    那现在这两种概率你觉得是一样的吗?

    答案肯定是不一样的,第一个是百分之一,第二个则是万分之一。因为第一个没有算小数,第二个还有两位小数,看似相等,其实已经变了。

    如下图:这三个箭头指向,所占比例大概就是80%,20%,当我们数据越多,范围就会越广,如果随机,那数据会更容易落到80%。

    抽奖概率正确性,我们其实可以从概率的统计定义中来看待。

    在一定条件下,重复做n次试验,nA为n次试验中事件A发生的次数,如果随着n逐渐增大,频率nA/n逐渐稳定在某一数值p附近,则数值p称为事件A在该条件下发生的概率。

    就是说数值越多,越是能证明概率的正确性。但是,我们抽奖只有一次机会。对于我来说80%肯定比20%更加容易随机。

    代码控制:控制随机值,1-10000。

    第五种:某荣耀-有机率

    有机率估计是某王常用套路了,有机率基本等于没有。文字游戏算是被玩明白了。当然因为用户体量比较大,因此,也可能采用第4种方式,万分之一,或者是百万分之一。

    第六种:保底机制

    这种机制就是比较明确的,整体意思就是,我已经做好坑你准备了,但是坑了我就收手,让你看到希望,给你大奖。常见的有抽了多少次,我就给你中什么奖品。

    这里我们设置保底机制为10次必中一等奖。如果前9次都没有中奖,第10次一定中一等奖。

    代码如下:

    import random
     
    # 奖品列表和对应的概率
    prizes = {"一等奖": 1, "二等奖": 2, "三等奖": 3, "参与奖": 94}
     
    lottery_num = 0  # 记录已经抽中的一等奖、二等奖、三等奖的次数
    # 抽奖函数
    def lottery():
        # 生成一个1~100之间的随机数
        global lottery_num
        lucky_number = random.randint(1, 100)
        print(lucky_number,lottery_num)
        # 初始化概率总和和奖品名称
        prob_sum = 0
        prize_name = None
     
        # 遍历奖品列表
        for name, prob in prizes.items():
            # 累加概率总和
            prob_sum += prob
            # 如果随机数小于等于概率总和,则中奖
            if lucky_number <= prob_sum:
                prize_name = name
                break
        if prize_name=="参与奖":
            lottery_num += 1
            if lottery_num == 10:
                return "恭喜你,中一等奖"
            return prize_name
        else:
            lottery_num=0
            return prize_name
     
    for i in range(10):
        print(lottery())

    위 내용은 Python으로 복권 시스템을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제