python實(shí)現(xiàn)抽獎(jiǎng)小程序
本文實(shí)例為大家分享了python實(shí)現(xiàn)抽獎(jiǎng)小程序的具體代碼,供大家參考,具體內(nèi)容如下
設(shè)計(jì)一個(gè)抽獎(jiǎng)服務(wù)
背景:有x個(gè)獎(jiǎng)品,要求在y天內(nèi)發(fā)完;每天至少發(fā)放z個(gè)獎(jiǎng)品;每天抽獎(jiǎng)人數(shù)不定,事先會假設(shè)一個(gè)范圍是m-n
舉例:有100個(gè)獎(jiǎng)品,要求5天內(nèi)發(fā)完,每天至少發(fā)15個(gè)獎(jiǎng)品;每天來抽獎(jiǎng)的人估計(jì)是 2000-3000 人,希望獎(jiǎng)品能夠比較均勻,但隨機(jī)的抽取出來。
接口要求:服務(wù)監(jiān)聽一個(gè)端口,測試程序不斷連接,發(fā)送一個(gè)數(shù)字代表是第幾天,比如第1-2000個(gè)請求發(fā)送1(模擬第一天來了2000人),第2001到5000請求發(fā)送2(模擬第二天來了3000人)... 服務(wù)返回 0 or 1 表示是否抽到獎(jiǎng)品
client.py:設(shè)置初始化參數(shù),模擬用戶向server端發(fā)送數(shù)據(jù)
# -*- coding: utf-8 -*-
import socket
import random
address = ('127.0.0.1', 31500)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
x = int(input("獎(jiǎng)品個(gè)數(shù)x:"))
y = int(input("發(fā)放天數(shù)y:"))
z = int(input("每天至少發(fā)放獎(jiǎng)品個(gè)數(shù):"))
m = int(input("最少人數(shù)m:"))
n = int(input("最多人數(shù)n:"))
data = '{"x":'+str(x)+',"y":+'+str(y)+',"z":'+str(z)+',"m":'+str(m)+',"n":'+str(n)+'}'
s.sendto(data.encode('utf-8'), address)
for day in range(y):
num = random.randint(m, n)
print("第",day+1,"天人數(shù)為",num)
k=0
for k in range(num):
s.sendto(str(day+1).encode('utf-8'), address)
s.close()
server.py:服務(wù)端接收初始數(shù)據(jù)和每個(gè)用戶發(fā)送的數(shù)據(jù)
# -*- coding: utf-8 -*-
import socket
import lottery
address = ('127.0.0.1', 31500)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(address)
list=[]
data, addr = s.recvfrom(2048)
data = data.decode('utf-8')
print ("received:", data, "from", addr)
dic=eval(data)
x=dic['x']
y=dic['y']
z=dic['z']
m=dic['m']
n=dic['n']
k=0
preday = 1
while True:
k += 1
day, addr = s.recvfrom(2048)
if not day:
print ("client has exist")
break
if preday != day:
list.append(k-1)
preday = day
day = int(day.decode('utf-8'))
x -= lottery.check(x,y,z,m,n,k,day,list)
s.close()
lottery.py:抽獎(jiǎng)程序算法
#Filename:lottery.py
def check(x,y,z,m,n,k,day,list):
#估計(jì)到來當(dāng)天的人數(shù)和獎(jiǎng)品的個(gè)數(shù)
if day == 1 or day == y:
e_x = z
e_people = n
elif day == y:
e_x = x
e_people = n
else:
e_x = x/(y+1-day)
e_people = sum(list)/len(list)
#中獎(jiǎng)間隔
length = int(e_people/e_x)
lucky = 0
if x>0 and k%length == 0 :
#print(x,"第",k,"個(gè)中獎(jiǎng)")
lucky = 1
print("第",k,"個(gè)--第",day,"天--是否中獎(jiǎng)--",lucky)
return lucky
源碼下載:python實(shí)現(xiàn)抽獎(jiǎng)小程序
想要學(xué)習(xí)更多關(guān)于抽獎(jiǎng)功能的實(shí)現(xiàn),請參考此專題:抽獎(jiǎng)功能
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python?pip特殊用法之pip?install?-v?-e?.命令詳解
這篇文章主要給大家介紹了關(guān)于python?pip特殊用法之pip?install?-v?-e?.命令的相關(guān)資料,文中通過圖文以及實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-09-09
Python代碼集pathlib應(yīng)用之獲取指定目錄下的所有文件
這篇文章主要介紹了Python代碼集pathlib應(yīng)用之獲取指定目錄下的所有文件,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03

