随机抽奖中将的算法,哪位大神可以提供吗

养歌 2018-08-24 06:07:00
我本意是:有6个奖项和一个谢谢,
1 没中奖 谢谢参与 中将名额:无限额
2 五等奖:10元代金券 中奖名额:500名
3 四等奖:水动力套装 中奖名额:300名
4 三等奖:鱼子蛋白套装.。 中奖名额:100名
5 二等奖:二等奖-电热水壶 中奖名额:50名
6 一等奖:时尚手机 中奖名额:20名
7 特等奖:深圳亲海两日游 中奖名额:10名 特等奖概率是1/50000
...全文
449 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
sjlzcj 2018-09-03
  • 打赏
  • 举报
回复
引用 4 楼 weixin_42129373 的回复:
[quote=引用 3 楼 sjlzcj 的回复:]
[quote=引用 2 楼 weixin_42129373 的回复:]
兄弟,没中奖的中将名额是无限的,也就是正无穷,然后 特等奖概率是1/50000 ,你觉得这逻辑上说得通吗


为什么说不通? 抽奖是活动,活动不结束就一直可以抽奖,但不代表奖项没有发完。也就是在最后一个奖项发完之后,抽奖的永远都是 谢谢参与


@wuhuayangs
简单点的方案,建立一个 50W长度的数组 然后将 所有奖项洗牌到数组中 然后抽奖就是随机下标,同时记录对应下标位置的奖项情况

当然 如果觉得50W 太大,,5W 长度也行,,不过每个下标对应的位置就是个 int 数字了 比如 下标100 是 特等奖,初始就是10 抽一次 -1,为了提高如五等奖中奖率,可以将500才分成多个块,比如 下标 1 10个 2 10个 等等 其他一样[/quote]哈哈,你这个想法很有意思,先不说“在最后一个奖项发完之后,抽奖的永远都是 谢谢参与”有没有现实意义,我对中奖率的理解:(所有能中将的票数)/(所有能中将的票数+所有不能中将的票数)这样有错吗[/quote]

站在数学或者程序的角度你的理解没有问题,但实际是抽奖是一种活动,为了某些目的的活动,促销也好,提升活跃度也好。所以未中奖的概率其实只是一块遮羞布,实际操作中,只要确保奖品,尤其是各种大奖以小概率发放出去即可以了,就算你严格的按照数学去设定特等奖的概率,但实际上谁有会去统计这个是否正确呢
谦虚的兔子 2018-08-28
  • 打赏
  • 举报
回复
难道这种活动,还真的能中奖吗?如果真能中,那6楼的就挺好的。
stacksoverflow 2018-08-28
  • 打赏
  • 举报
回复
1 没中奖 谢谢参与 中将名额:无限额
2 五等奖:10元代金券 中奖名额:500名 概率50/50000
3 四等奖:水动力套装 中奖名额:300名 概率30/50000
4 三等奖:鱼子蛋白套装.。 中奖名额:100名 概率10/50000
5 二等奖:二等奖-电热水壶 中奖名额:50名 概率5/50000
6 一等奖:时尚手机 中奖名额:20名 概率2/50000
7 特等奖:深圳亲海两日游 中奖名额:10名 特等奖概率是1/50000

出一个随机整数1到50000范围内(自己百度,注意是整数,不带小数位)
结果为1,则是特定奖
结果为2,3则是一等奖
结果为4,5,6,7,8则是二等奖
结果为9-18则是三等奖
结果为19-48则是四等奖
结果为49-98则是五等奖
其它为[谢谢参与],中将但奖品已发完为[谢谢参与]
nayi_224 2018-08-28
  • 打赏
  • 举报
回复
	static int[][] arr = {{10, 10}, {30, 20}, {80, 50}, {180, 100}, {480, 300}, {980, 500}, {99999999, 99999999}};
static String[] desc = {"特等奖", "一等奖", "3等奖", "4等奖", "5等奖", "6等奖", "7等奖" };

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int i = 1000;
while(i-- > 0){
comeOn((int)(Math.random() * 500000 + 1));
}
}

public static void comeOn(int random){
for(int i = 0; i < arr.length; i++){
if(random <= arr[i][0]){
if(arr[i][1] > 0){
arr[i][1] = arr[i][1] - 1;
System.out.println(desc[i]);
return;
}else {
System.out.println(desc[desc.length - 1]);
}
}
}
}
nayi_224 2018-08-28
  • 打赏
  • 举报
回复
引用 5 楼 nayi_224 的回复:
	static int[][] arr = {{10, 10}, {30, 20}, {80, 50}, {180, 100}, {480, 300}, {980, 500}, {99999999, 99999999}};
static String[] desc = {"特等奖", "一等奖", "3等奖", "4等奖", "5等奖", "6等奖", "7等奖" };

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int i = 1000;
while(i-- > 0){
comeOn((int)(Math.random() * 500000 + 1));
}
}

public static void comeOn(int random){
for(int i = 0; i < arr.length; i++){
if(random <= arr[i][0]){
if(arr[i][1] > 0){
arr[i][1] = arr[i][1] - 1;
System.out.println(desc[i]);
return;
}else {
System.out.println(desc[desc.length - 1]);
}
}
}
}


else后面少个return
Java20180301 2018-08-27
  • 打赏
  • 举报
回复
引用 3 楼 sjlzcj 的回复:
[quote=引用 2 楼 weixin_42129373 的回复:]
兄弟,没中奖的中将名额是无限的,也就是正无穷,然后 特等奖概率是1/50000 ,你觉得这逻辑上说得通吗


为什么说不通? 抽奖是活动,活动不结束就一直可以抽奖,但不代表奖项没有发完。也就是在最后一个奖项发完之后,抽奖的永远都是 谢谢参与


@wuhuayangs
简单点的方案,建立一个 50W长度的数组 然后将 所有奖项洗牌到数组中 然后抽奖就是随机下标,同时记录对应下标位置的奖项情况

当然 如果觉得50W 太大,,5W 长度也行,,不过每个下标对应的位置就是个 int 数字了 比如 下标100 是 特等奖,初始就是10 抽一次 -1,为了提高如五等奖中奖率,可以将500才分成多个块,比如 下标 1 10个 2 10个 等等 其他一样[/quote]哈哈,你这个想法很有意思,先不说“在最后一个奖项发完之后,抽奖的永远都是 谢谢参与”有没有现实意义,我对中奖率的理解:(所有能中将的票数)/(所有能中将的票数+所有不能中将的票数)这样有错吗
sjlzcj 2018-08-27
  • 打赏
  • 举报
回复
引用 2 楼 weixin_42129373 的回复:
兄弟,没中奖的中将名额是无限的,也就是正无穷,然后 特等奖概率是1/50000 ,你觉得这逻辑上说得通吗


为什么说不通? 抽奖是活动,活动不结束就一直可以抽奖,但不代表奖项没有发完。也就是在最后一个奖项发完之后,抽奖的永远都是 谢谢参与


@wuhuayangs
简单点的方案,建立一个 50W长度的数组 然后将 所有奖项洗牌到数组中 然后抽奖就是随机下标,同时记录对应下标位置的奖项情况

当然 如果觉得50W 太大,,5W 长度也行,,不过每个下标对应的位置就是个 int 数字了 比如 下标100 是 特等奖,初始就是10 抽一次 -1,为了提高如五等奖中奖率,可以将500才分成多个块,比如 下标 1 10个 2 10个 等等 其他一样
Java20180301 2018-08-25
  • 打赏
  • 举报
回复
兄弟,没中奖的中将名额是无限的,也就是正无穷,然后 特等奖概率是1/50000 ,你觉得这逻辑上说得通吗
wildyy 2018-08-24
  • 打赏
  • 举报
回复
其他奖项的概率是按特等奖的倍数算还是你自己定的,自己定的话将所有奖项的中奖概率列出来,程序其实很简单的

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧