c# 抽奖概率实现到运算的问题
商品表这样设计。总归200个奖项。抽200次。保证用户肯定会中奖。网上我看很多设置抽奖概率的做法,但是每次抽奖时,独立计算概率的,并不能实现我想要的实际效果(比如,200...
商品表这样设计。
总归200个奖项。抽200次。保证用户肯定会中奖。网上我看很多设置抽奖概率的做法,但是每次抽奖时,独立计算概率的,并不能实现我想要的实际效果(比如,200个人抽完了。大奖一个都没出现。或者小礼品超过100个了)。奖品和数量人为定制,几率也是可以算出来的。有没有哪个算法,可以根据几率,算出抽奖之后的结果(比如抽200次,虽然每次抽到的结果不一样。但是各奖项奖品总数是不会出错的。)
或者在数据库设计上是否有别的方法?请大神帮忙。
做这个软件的情况是,商场积分换抽奖的活动。。总共备了200个奖。。用户登记下后,,找到用户资料。扣除其积分卡的积分。换一次抽奖机会。保证中奖的。。 展开
总归200个奖项。抽200次。保证用户肯定会中奖。网上我看很多设置抽奖概率的做法,但是每次抽奖时,独立计算概率的,并不能实现我想要的实际效果(比如,200个人抽完了。大奖一个都没出现。或者小礼品超过100个了)。奖品和数量人为定制,几率也是可以算出来的。有没有哪个算法,可以根据几率,算出抽奖之后的结果(比如抽200次,虽然每次抽到的结果不一样。但是各奖项奖品总数是不会出错的。)
或者在数据库设计上是否有别的方法?请大神帮忙。
做这个软件的情况是,商场积分换抽奖的活动。。总共备了200个奖。。用户登记下后,,找到用户资料。扣除其积分卡的积分。换一次抽奖机会。保证中奖的。。 展开
展开全部
没做过这种,想了一下比较简单的方法,看一下你上面奖品设置是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之后最终上面那个序列为空
抽奖时,从1-序列总长中随机取值(当然第一次就为200),比如为150,取出上面那个序列第150个字符的值,对应的数字即为奖品,将这150处的字符删除一个(此时序列总长为199)。当然这里你可以先做判断,每抽到一次奖就将奖品序号count处对应的数据减1,比如150取到的是2,先查一下上面id为2的那个coun是不是大于0,如果大于,那奖品就是键盘,除了前面的删除字符,上面的count处的8也要减去1),重复这个过程,第二次抽奖随机数为1-199,这样200次抽奖就都能抽到不同的奖品,抽200之后最终上面那个序列为空
更多追问追答
追问
这个112222...的方法有想过。。但这一感觉表一打开。。好大一串。。所以才在后面加了count这一列替代了那么多行数。所以想问问有木有其他的写法。。
忘记说了。。这个抽奖呢是商场积分卡的活动。用户过来登记,数据库找到该用户数据,然后扣积分,得到一次抽奖机会。是面对面直接进行的。所以章氏朋友的这个方法没法适用,因为数据库里人并不是所有人都来抽的,也许有的人不来的呢。
不过还是谢谢帮忙哈~
追答
我这只是提供思路,实际情况你可以灵活处理,你可以不用保存那个序列值,而是抽奖时先取奖品的数量值,动态拼成这个序列,同样乱序之后随机取值就行了,基本跟上面一样的,抽到后将count减1就行了。但你不保存序列的坏处就来了,就是没办法记录详细的抽奖日志了(以供以后查询,比如原始序列是多少,某个用户抽奖序列号是多少就没办法记录了)
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这有什么难的。
比如一个奖是%3.一共有200个人。得奖者是200*0.03==6
然后就是分奖了
int [] 人=new int[200];
int [] 得奖者=new int [6];
for(int i=0;i<6;i++)
{
int 得奖号=radom(200);
if(人[得奖号]!=0)//分奖
{
人[得奖号]=1;//假如1是这个奖项的。
得奖者[i]=得奖号;
}
else
{
i--;continue;//也就是说这次当没干
}
}
简单吧?
比如一个奖是%3.一共有200个人。得奖者是200*0.03==6
然后就是分奖了
int [] 人=new int[200];
int [] 得奖者=new int [6];
for(int i=0;i<6;i++)
{
int 得奖号=radom(200);
if(人[得奖号]!=0)//分奖
{
人[得奖号]=1;//假如1是这个奖项的。
得奖者[i]=得奖号;
}
else
{
i--;continue;//也就是说这次当没干
}
}
简单吧?
追问
这个112222...的方法有想过。。但这一感觉表一打开。。好大一串。。所以才在后面加了count这一列替代了那么多行数。所以想问问有木有其他的写法。。
忘记说了。。这个抽奖呢是商场积分卡的活动。用户过来登记,数据库找到该用户数据,然后扣积分,得到一次抽奖机会。是面对面直接进行的。所以章氏朋友的这个方法没法适用,因为数据库里人并不是所有人都来抽的,也许有的人不来的呢。
不过还是谢谢帮忙哈~
追答
你回错人了。我这个就是生成一个得奖单。用户来了以后可以随机的提取一个名额。这个名额是已经分好奖的不是么。我没用什么得奖序列,因为奖品的类型不一样的。
上面的是生成随机200人名单对奖品的。人来了以后要这样
for(int i=0;i0)
{
//给他奖
人[名单编号]=-1;//下次不能找这个编号
}
else
{
i--;
}
}
其实按顺序来领编号也不是不可以。
我不明白我的算法竟然比序列还难懂。。。这怎么可能。。。他跟我都是一样先把奖分好了等人来领号码。
你要的是保证200个人来领奖,奖都够分,也不少给。要是想动态修改按人数放概率。那第一个人岂不是必须拿奖?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询