用C#如何实现这样的概率算法呢?

jianche 2014-09-01 03:18:09
现在有一个抽奖活动要举办,假设有10000人参加,要求需要有100人中奖,求这个概率的算法应该怎么写呢?正着写好写,

double ss=0;
for (int j = 0; j < 10; j++)
{
int s = 0;
for (int i = 0; i < 1000; i++)
{
Random r = new Random();
int x = r.Next(0, 3);//随即产生0-100之间的整数
if (x == 1)
{
s++;
}
Thread.Sleep(1);
}
ss += s;
}
label2.Text = (ss / 10000).ToString();

按照1/4的概率来算的话,大概有33%的人会中奖,但是反着规定好中奖比率,怎么求设定概率呢?
...全文
853 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
我叫小菜菜 2014-09-01
  • 打赏
  • 举报
回复
引用 5 楼 jianche 的回复:
[quote=引用 1 楼 Z65443344 的回复:] 当每个人去抽奖的时候才动态去判断他是否获奖,这个方法不靠谱. 概率毕竟是概率,不是准确的,所以如果设定1%的概率获奖,10000人可能有200+人中奖,也可能50-人中奖,并不能保证刚好100人 应该生成个10000的数组,然后循环100次,获取100个随机号码,这100个人中奖
但是抽奖的操作是实时的,并非所有人都已经在一个列表里了再抽奖,比如消费后抽个奖,当已经有100人中奖后便不再可能会有人中奖,这样也可以用数组方式来操作吗?[/quote] 如果是实时抽奖,中奖人数达到指定值n后就停止抽奖的,那更简单了: 预先设置好一个集合:其中包含n个不重复的数字。 每来一个人抽奖,就随机生成一个数字,遍历集合,如果都不在集合内,就是没中奖。 如果那个数字在集合内,就中奖。然后从集合中移除那个数字。 集合为空则停止抽奖。 中奖概率可以由随机生成数字的范围和n控制。 中奖概率=n/随机数字区间长度
我叫小菜菜 2014-09-01
  • 打赏
  • 举报
回复
一、输入条件: 1.总的抽奖人数 2.中奖概率(求出:中奖人数总的抽奖人数*中奖概率) 二、抽奖流程: 申请一个中奖人的ID集合(set),初始化为空, for(int i=0;i<中奖人数;i++) { 随机产生[1-总人数之间]之间的一个整数R,作为预中奖号码; 遍历中奖集合ID(set集合),判断R是否已存在 while(R in set) { 重新随机产生一个整数R; 再判断; } 把R加入set; } 输出set集合,即为中奖人数ID。
jianche 2014-09-01
  • 打赏
  • 举报
回复
引用 4 楼 Z65443344 的回复:
前面给出的算法是,每个人先分个号码,再抽奖,跟买彩票一样 如果不想先分号码,也有办法 还是生成个10000的数组,规定前100个就是中奖 然后每来一个人,随机抽一个号 抽过的号码在数组里移除
谢谢 是这个意思
jianche 2014-09-01
  • 打赏
  • 举报
回复
引用 1 楼 Z65443344 的回复:
当每个人去抽奖的时候才动态去判断他是否获奖,这个方法不靠谱. 概率毕竟是概率,不是准确的,所以如果设定1%的概率获奖,10000人可能有200+人中奖,也可能50-人中奖,并不能保证刚好100人 应该生成个10000的数组,然后循环100次,获取100个随机号码,这100个人中奖
但是抽奖的操作是实时的,并非所有人都已经在一个列表里了再抽奖,比如消费后抽个奖,当已经有100人中奖后便不再可能会有人中奖,这样也可以用数组方式来操作吗?
於黾 2014-09-01
  • 打赏
  • 举报
回复
前面给出的算法是,每个人先分个号码,再抽奖,跟买彩票一样 如果不想先分号码,也有办法 还是生成个10000的数组,规定前100个就是中奖 然后每来一个人,随机抽一个号 抽过的号码在数组里移除
newxdlysk 2014-09-01
  • 打赏
  • 举报
回复
10000个人随机找100个出来中奖 Enumerable.Range(1,10000).OrderBy(x=>Guid.NewGuid()).Take(100).ToList().ForEach(x=> Console.Write(x+"\t"));
正宗熊猫哥 2014-09-01
  • 打赏
  • 举报
回复
要求100中奖,返回100个不重复的号码不就得了
於黾 2014-09-01
  • 打赏
  • 举报
回复
当每个人去抽奖的时候才动态去判断他是否获奖,这个方法不靠谱. 概率毕竟是概率,不是准确的,所以如果设定1%的概率获奖,10000人可能有200+人中奖,也可能50-人中奖,并不能保证刚好100人 应该生成个10000的数组,然后循环100次,获取100个随机号码,这100个人中奖

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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