R9000K抽奖划分

Python011

R9000K抽奖划分,第1张

正常抽奖都是随机的,靠运气,没有什么先后顺序,除非奖品个数有限,先抽的获奖几率就大,如果奖品由被抽走的,那再抽获奖几率就小了。

联想拯救者r9000k 2021款笔记本,是目前一款很值得入手的高端旗舰游戏本,配上了最新的5000标压处理器,满血版的显卡,高分辨率的显卡。

R9000K 2021款采用了Zen3架构的R9-5900HX标压处理器,,8核心16线程,主频为3.3GHz,拥有强大的运算速度和多任务处理能力。显卡为NVIDIA GeForce RTX3080独立显卡,最高165W功耗释放,显存升级至16GB GDDR6,支持独显直连。32GB DDR4 3200MHz双通道内存,1TB PCIe 3.0 TLC 固态硬盘,并预留了M.2拓展接口。

用data.txt文件保存以下内容:

13725528132 李桂荣

13725528131 李二来

13725528133 张荣刚

13725528130 荣南

13725528137 王三

13725528138 吴立

13725528139 郭德纲

13725528140 周星驰

13725528141 张曼玉

13725528142 张艺谋

13725528152 秦香莲

13725528162 潘金莲

13725528172 李大嘴

13725528182 展堂

//源代码如下

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#define MAX_NUM 9999

//定义保存人名和电话的数据结构

struct Person

{

char name[20]

char telno[15]

char award

}

int num = 0//统计人数

FILE *fp//文件指针

Person persons[MAX_NUM]//定义数组

int awarder_1[1] = {-1}//一等奖

int awarder_2[2] = {-1, -1}//二等奖

int awarder_3[5] = {-1, -1, -1, -1, -1}//三等奖

//读取文件

void readdata()

{

int i = 0//数组下标

Person person

//文件打开

fp = fopen("data.txt", "r")

if (fp == NULL)

{

printf("打开文件data.txt失败!\n")

return

}

//当文件不为空

while (!feof(fp))

{

num ++

fscanf(fp, "%s", person.telno)

fscanf(fp, "%s", person.name)

person.award = 'F'

persons[i++] = person

}

}

//初始化标识

void init()

{

for(int i = 0i <numi++)

{

persons[i].award = 'F'

}

}

//显示单个中奖信息

void info( int i)

{

printf("手机号码: %s 姓名: %s\n", persons[i].telno, persons[i].name)

}

void main()

{

char again = 'Y'

//读取文件

readdata()

printf("简单抽奖程序\n")

srand((long)time(0))

while(again == 'Y' || again == 'y')

{

//初始化标识

init()

printf("\n开始抽第一等奖(1名),按任意键开始...\n")

getchar()

awarder_1[0] = abs(rand() % num)

while (persons[awarder_1[0]].award == 'T')

{

awarder_1[0] = rand() % num

}

persons[awarder_1[0]].award = 'T'

info(awarder_1[0])

printf("\n开始抽第二等奖(2名)\n")

for (int i = 0i <2i++)

{

printf("\n第%d个二等奖,按任意键开始...\n", i+1)

getchar()

awarder_2[i] = rand() % num

while (persons[awarder_2[i]].award == 'T')

{

awarder_2[i] = rand() % num

}

persons[awarder_2[i]].award = 'T'

info(awarder_2[i])

}

printf("\n\n开始抽第三等奖(5名)\n")

for (i = 0i <5i++)

{

printf("\n第%d个三等奖,按任意键开始...\n", i + 1)

getchar()

awarder_3[i] = rand() % num

while (persons[awarder_3[i]].award == 'T')

{

awarder_3[i] = rand() % num

}

persons[awarder_3[i]].award = 'T'

info(awarder_3[i])

}

printf("\n是否重新开始抽奖?(Y or N)...\n")

again = getchar()

}

getchar()

return

}

常见的有两种

第一类是常见的有等级的抽奖活动,如一等、二等、三等奖等等

// 分别为一、二、三、四等将的奖品数量,最后一个为未中奖的数量。  

    private static final Integer[] lotteryList = {5, 10, 20, 40, 100}  

  

    private int getSum() {  

        int sum = 0  

        for (int v : lotteryList) {  

            sum += v  

        }  

        return sum  

    }  

  

    private int getLotteryLevel() {  

        Random random = new Random(System.nanoTime())  

        int sum = getSum()  

        for (int i = 0 i < lotteryList.length ++i) {  

            int randNum = Math.abs(random.nextInt()) % sum  

            if (randNum <= lotteryList[i]) {  

                return i  

            } else {  

                sum -= lotteryList[i]  

            }  

        }  

        return -1  

    }

第二类是不分等级的抽奖活动,仅需要参与人数与奖品总数,各奖品中奖概率相等。

//另一种抽奖算法,用于公司抽奖,即总参与人数与奖品数固定。  

    private static final int lotteryNum = 75  

    private static final int total = 175  

    private static Set<Integer> lotterySet = new HashSet<Integer>()  

    static {  

        for (int i=1 i <= lotteryNum ++i) {  

            lotterySet.add(total*i/lotteryNum)  

        }  

    }  

    private int getLotteryNum2() {  

        Random rand = new Random(System.nanoTime())  

        int randNum = Math.abs(rand.nextInt()) % total  

        if (lotterySet.contains(randNum)) {  

            return randNum*lotteryNum/total  

        }  

        return -1  

    }