可以实现前几条,但是,“中奖次数的概率分布”是什么意思?
如图所示:
A2输入=B1
B2输入=IF((A2<>"")(A2>2),IF(INT(RAND()4+1)=1,"奖品",1),"")
A3输入=IF(AND(A2>2,A2<>""),A2-3+ISNUMBER(B2),"")
C3输入=SUM((B1:B1000<>"")1) shift+enter+ctrl 三键结束
D3输入=COUNTIF(B1:B1000,"奖品")
将B2,A3分别下拉填充。
这样,在B1中输入原有的券数就可以了。
简单的将权重就是某个奖品的中奖率,总权重就是所有的中奖率相加得到的总数(当然如果是抽奖的话所有奖品加起来最高也就是100,因为100就是百分之百中奖咯)。
总权重为10(1+2+3+4),那么怎么做到按权重随机呢根据10随机出一个整数,假如为随机出来的是2然后依次和权重相减,比如 2(随机数)-1(A的权重) = 1 ,然后 1(上一步计算的结果)-2(B的权重) = -1 ,此时 -1 < 0 ,那么则调用B(也就是中奖的奖品是B咯),其他的以此类推,还有一点比较重要的就是将 每个权重(中奖率)x10000(或者更高) ,然后随机的数字在 总权重(所有中奖率相加)10000 ,这个概率会更均匀分布。
public class Lottery {
private int m = 1000;//发放奖券的数量
private int n = 2;//奖品的数量
public boolean getLottery(){
boolean isLottery = false;
double d = (double)n/(double)m;//中奖概率
double r = Mathrandom();//0~1之间的随机数,包括0
if(r<d){//如果随机数小于概率 那么中奖
n--;//奖品数量-1
isLottery = true;
}
m--;//奖券数量-1
return isLottery;
}
}
没做过这种,想了一下比较简单的方法,看一下你上面奖品设置是1-5,200人抽一定中,那就在数据库中提交时创建一个200长度的字符串,一个字符代表一个奖品,比如iphone5是两个1,键盘是8个2,这样这个字符串就形如1122222222333333共200个,然后随机打乱它们的顺序(比如循环200次,从第一个字符开始,随机这个位置与另一个随机位置的数据,当然这仅是一种方法,具体怎么处理随你,总之最后得到一个乱序的序列)
抽奖时,从1-序列总长中随机取值(当然第一次就为200),比如为150,取出上面那个序列第150个字符的值,对应的数字即为奖品,将这150处的字符删除一个(此时序列总长为199)。当然这里你可以先做判断,每抽到一次奖就将奖品序号count处对应的数据减1,比如150取到的是2,先查一下上面id为2的那个coun是不是大于0,如果大于,那奖品就是键盘,除了前面的删除字符,上面的count处的8也要减去1),重复这个过程,第二次抽奖随机数为1-199,这样200次抽奖就都能抽到不同的奖品,抽200之后最终上面那个序列为空
以上就是关于EXCEL抽奖问题的算法全部的内容,包括:EXCEL抽奖问题的算法、抽奖功能实现(纯算法)、求java算法:根据物品的数量来确定抽奖的概率(当物品数量为0时无论如何都不可能选到)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)