asp.net关于抽奖概率算法,多谢大家帮忙指点下思路,或者有实例源码更好!急急急!!!!

tololo 2014-09-19 02:26:46
我可以根据用户设置的概率或者一个计算概率的公式,然后根据设置的概率或者公式来抽奖,我自己想了一个思路,但是感觉我这样每次都往数组中添加那么多数是不明智的做法,谁能帮指点下,我把我的贴出来大家理解看一下我的想法,
 //一等奖个数
int Awards1 = 2;
//二等奖个数
int Awards2 = 5;
//抽奖次数
int count = 1;
//奖品个数
ArrayList awardsCount = new ArrayList() { 2, 5 };
ArrayList list = new ArrayList();
Random r = new Random();
//1000是预估计参与的人数,中奖概率=奖品总个数/1000*抽奖次数
for (int i = 0; i < 1000 * 1 - Awards1 - Awards2; i++)
{
//往数组中添加(1000*1-Awards1-Awards2)个0
list.Add(0);
}

for (int i = 0; i < awardsCount.Count; i++)
{
for (int j = 0; j < Convert.ToInt32(awardsCount[i]); j++)
{
//往数组中根据随机索引添加2(一等奖)个1和5(二等奖)个2
list.Insert(r.Next(0, list.Count), i + 1);
}
}
//测试随机抽奖1000次,如果为1就是一等级,2就是二等奖
for (int k = 0; k <1000; k++)
{
Response.Write(list[r.Next(0, list.Count)]);
}
...全文
417 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
tololo 2014-09-22
  • 打赏
  • 举报
回复
引用 10 楼 gxingmin 的回复:
我靠,代码都给你写成这样了,还球顶,你把那几个变量做成参数,从数据库里读出去不就ok了吗?
主要是我这种方法不明智阿,每次抽奖都要往数组里面添加那么多元素,不觉得很不明智吗,参数改为变量我肯定知道阿,读取数据库也很容易,主要是过程
gxingmin 2014-09-19
  • 打赏
  • 举报
回复
我靠,代码都给你写成这样了,还球顶,你把那几个变量做成参数,从数据库里读出去不就ok了吗?
tololo 2014-09-19
  • 打赏
  • 举报
回复
求顶求帮助
LiDiyto 2014-09-19
  • 打赏
  • 举报
回复
於黾 2014-09-19
  • 打赏
  • 举报
回复
引用 6 楼 u013331731 的回复:
[quote=引用 4 楼 Z65443344 的回复:] 至于web使用中,多用户同时操作同一个list,怎么避免脏数据等问题 可以把抽奖方法定义成静态函数,加锁控制
大神能不能写个方法参考一下,我的奖品以及奖品个数,预估计人数都是从数据库取出来的,应该怎么做?[/quote] 写个静态方法,先判断静态数组里是否为空,为空就读数据库,然后初始化 不为空就直接执行抽奖的逻辑呗
tololo 2014-09-19
  • 打赏
  • 举报
回复
引用 4 楼 Z65443344 的回复:
至于web使用中,多用户同时操作同一个list,怎么避免脏数据等问题 可以把抽奖方法定义成静态函数,加锁控制
大神能不能写个方法参考一下,我的奖品以及奖品个数,预估计人数都是从数据库取出来的,应该怎么做?
gxingmin 2014-09-19
  • 打赏
  • 举报
回复
//一等奖个数
            int Awards1 = 2;
            //二等奖个数
            int Awards2 = 5;
            //抽奖次数
            int count = 1;
          int personNum=1000; //抽奖人数
           int []arry=new int[personNum];
           for(int i=0;i<personNum;i++)
               arry[i]=i;
     
 Random r = new Random();

//先抽二等奖
int n=0;
while(n<Awards2)
{
      int k=r.Next(0, personNum);
      Console.Write("二等奖是第" +( arry[k] + 1)+ "、 ";
     arry[k]=arry[personNum-1];
     personNum--;
     n++;
}
Console.WriteLine("个人");

//再抽一等奖
n=0;
while(n<Awards1)
{
      int k=r.Next(0, personNum);
      Console.Write("一等奖是第" +( arry[k] + 1)+ "、 ";
     arry[k]=arry[personNum-1];
     personNum--;
     n++;
}
Console.WriteLine("个人");
於黾 2014-09-19
  • 打赏
  • 举报
回复
至于web使用中,多用户同时操作同一个list,怎么避免脏数据等问题 可以把抽奖方法定义成静态函数,加锁控制
於黾 2014-09-19
  • 打赏
  • 举报
回复
还有,你这个list应该设置成全局静态的,所有用户都用同一个奖池,而不是每个用户又重新生成一遍 否则你没法控制到底抽到多少个奖 完全按概率随机是不靠谱的做法 万一有3个人抽到一等奖,你还自己掏腰包再给买个一等奖发给人家?
於黾 2014-09-19
  • 打赏
  • 举报
回复
你直接生成个list,大概有多少人参与抽奖,就设置多长 然后根据中奖概率,确定奖品个数,然后直接从前往后排,比如0和1是一等奖,2,3,4,5,6是二等奖 然后抽奖的人随机抽号就行了 抽到了号码就从数组里移除,后面的人再抽就抽不到了 反正抽号是随机抽的,到底哪个是奖就不用再随机给了,固定就可以了.

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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