Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk melaksanakan sistem loteri dalam Python

Bagaimana untuk melaksanakan sistem loteri dalam Python

王林
王林ke hadapan
2023-05-11 09:16:055330semak imbas

    1 Topik artikel

    Selepas melihat laporan penipuan loteri yang berkaitan, sesetengah orang tidak memahami perkara yang sedang berlaku. Untuk mengelakkan daripada ditipu oleh loteri, kami akan menggunakan beberapa contoh mudah untuk menerangkan logik loteri yang lebih mendalam, supaya semua orang dapat melihat secara intuitif apa yang tersembunyi di sebalik loteri dan mengelakkan daripada ditipu.

    2. Idea Reka Bentuk Loteri

    Pertama sekali, mari kita laksanakan logik loteri yang mudah kita perlu menentukan kebarangkalian setiap hadiah dan menariknya berdasarkan kebarangkalian .

    Langkah Pertama: Keperluan

    Terdapat senarai hadiah. Setiap hadiah mempunyai kebarangkalian yang sepadan. Pengguna cabutan hadiah untuk mendapatkan produk dengan kebarangkalian yang sepadan.

    Langkah 2: Buat senarai hadiah

    Mengikut keperluan di atas, kami mencipta jadual hadiah yang sepadan Kami memilih integer daripada 1 hingga 100 untuk kebarangkalian sudah tentu, anda juga boleh memilih 0-1.

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

    Langkah Tiga: Pelaksanaan Kebarangkalian

    Ini adalah logik loteri asas Kesukaran dalam pelaksanaan kod terutamanya kebarangkalian .

    Mengenai kebarangkalian, kita perlu menggunakan modul rawak iaitu perlu menggunakan nombor rawak. Di sini saya mempunyai dua cara untuk dipilih.

    Kaedah pertama: Pelaksanaan melalui selang waktu

    Kebarangkalian loteri dilaksanakan dengan memilih selang, membahagikan kebarangkalian loteri kepada beberapa selang, setiap selang sepadan dengan hadiah , dan kemudian Selang kemenangan ditentukan berdasarkan julat nombor rawak. Sebagai contoh, kita boleh membahagikan kebarangkalian loteri kepada selang berikut:

    • - Selang 1: 0%~20%, sepadan dengan hadiah A

    • - Selang 2: 20%~50%, sepadan dengan hadiah B

    • - Selang 3: 50%~80%, sepadan dengan hadiah C

    • - Selang 4: 80% ~ 100%, sepadan dengan selang hadiah D untuk menentukan hadiah kemenangan. Sebagai contoh, jika nombor rawak yang dijana ialah 35, maka selang kemenangan ialah 2, sepadan dengan hadiah B.

    • Kelebihan: Kelebihan melaksanakan kebarangkalian loteri dengan cara ini ialah kebarangkalian kemenangan bagi setiap hadiah boleh dikawal secara fleksibel, dan ia juga boleh diselaraskan mengikut situasi sebenar.

    Kelemahan: Jumlah kebarangkalian kemenangan bagi setiap hadiah mestilah sama dengan 100%, jika tidak, keputusan loteri akan menjadi tidak tepat.

    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

    Jenis kedua: Pelaksanaan melalui pengumpulan kebarangkalian hadiah

    Kami boleh melaksanakan loteri melalui pengumpulan kebarangkalian Pertama, hasilkan nombor rawak antara 1 dan 100 , menunjukkan keputusan loteri ini. Kemudian ganjaran dikumpul secara berurutan mengikut kebarangkalian hadiah, sehingga hasil terkumpul lebih besar daripada atau sama dengan nombor rawak.

    Kebarangkalian hadiah terakhir yang berhenti terkumpul ialah hadiah yang dimenangi dalam cabutan ini.

    Sebagai contoh, jika nombor rawak adalah 50, mengikut kaedah pengumpulan kebarangkalian, keputusan berikut boleh diperolehi:

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

    10< 🎜>10 + 20 = 30 < 50, bukan hadiah kedua;

    Oleh itu, hadiah yang dimenangi dalam cabutan ini adalah hadiah ketiga.

    Kelebihan: Kebarangkalian hadiah boleh dilaraskan secara fleksibel untuk mencapai kesan loteri yang berbeza. Kaedah ini juga boleh digunakan untuk berbilang hadiah Ia hanya perlu dikumpul mengikut kebarangkalian yang sepadan. Ia mudah difahami dan mudah dilaksanakan.

    Kelemahan: Kelemahannya ialah kebarangkalian terkumpul setiap hadiah perlu dikira Jika bilangan hadiah adalah besar, jumlah pengiraan mungkin besar.

    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

    Langkah 4: Tambah mekanisme khas

    Selepas kita menyertai aktiviti tertentu atau cabutan tertentu, kita akan sentiasa tergoda dan terbawa-bawa dengan hadiah besar Minda, kami tidak tahu apa itu mekanisme loteri, dan bagaimana untuk menyelesaikannya. Sebelum ini, kita boleh membiarkan setiap hadiah diundi mengikut kebarangkalian hadiah yang ditetapkan Pada masa ini, kita perlu menambah beberapa mekanisme khas ini adalah mekanisme untuk "ditipu", atau dengan kata lain, mekanisme untuk "disusun".

    Yang pertama: Biarkan sesiapa yang anda mahu memenangi hadiah memenangi hadiah

    Kaedah ini digunakan terutamanya dalam majlis gurauan parti Semua orang harus memberi perhatian kepada perkara ini. Jangan buat dalam talian, kerana anda tidak tahu siapa yang menulis program loteri ini.

    Untuk kaedah ini, kita perlu menambah senarai putih. Jika ia dinilai sebagai orang dalam senarai putih, maka kami akan membenarkan dia menanam hadiah yang ditetapkan.

    Kod adalah seperti berikut:
    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
    Jenis kedua: Anda boleh mengambil bahagian dalam loteri hanya selepas anda menyertai aktiviti lain

    Kaedah ini meningkatkan pengesahan kelayakan , atau mungkin anda hanya boleh mengambil bahagian dalam loteri selepas anda mempunyai maklumat pengguna, yang boleh dianggap sebagai menambah beberapa sekatan keselamatan.

    Hanya jika pengguna mengambil bahagian dalam aktiviti lain atau log masuk boleh dia mengambil bahagian dalam aktiviti dan memasuki proses aktiviti.

    Kodnya adalah seperti berikut:
    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"))#参与活动抽奖
    Jenis ketiga: Saya tidak akan benarkan awak menang walaupun saya mengalahkan awak sampai mati

    Ini jenis aktiviti semata-mata dilakukan oleh orang yang menjijikkan, tetapi semua pengguna yang mengambil bahagian tidak tahu sama sekali, dan semua akan menganggap bahawa itu adalah nasib malang mereka. Hadiah utama ada, tetapi anda tidak boleh mendapatkannya.

    Ini tidak menggunakan kebarangkalian dan memberikan anda hasilnya secara langsung Ini adalah kaedah pemasaran beliau.

    Kodnya macam... kalau tak sebagus..., tak perlu, pulangkan saja.
    第四种:概率都是百分比,但是效果不一样

    这种就需要和我们设置的随机范围撤上关系,我们的随机范围是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())

    Atas ialah kandungan terperinci Bagaimana untuk melaksanakan sistem loteri dalam Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Kenyataan:
    Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam