有牛人吗?求个算法!

520yunyuna 2012-05-15 03:48:42
从1-15数中,随机不放回取5个数,求取的5个数的和的所有可能值的概率的算法!
...全文
408 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
520yunyuna 2012-05-18
  • 打赏
  • 举报
回复
没牛人吗?
520yunyuna 2012-05-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

List<int> sum = new List<int>();
for (int i = 1; i <= 15; i++)
sum.Add(i);
var s = from t1 in sum
from t2 in sum
from t3 in sum
……
[/Quote]
刚测试了一下,发生System.OutOfMemoryException异常!
耗费资源太大!!
520yunyuna 2012-05-16
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 的回复:]

引用 19 楼 的回复:
引用 18 楼 的回复:

可能出现的和比较好算:
最小值1+2+3+4+5=15
最大值15+14+13+12+11=65
中间值=65-(65-15)/2=40
各个和出现的次数思路比较复杂,直接写结果:
N15=1次
N16=N15+0=1
N17=N16+N15=2
N40最大,后面反过来
N41=N39
。。。
N65=N15
……
[/Quote]
呵呵,不管如何,很谢谢你的回复!
EdsionWang 2012-05-16
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 的回复:]

不重复的5个数其和必不相同,所以所有可能和的概率是相同的:1/可能是组合总数
[/Quote]
概率怎么能相同呢?随机5个数,和的可能是在[15,65]之间。总共的取法应该有15!那么多,概率肯定不相同的
yangchun1213 2012-05-16
  • 打赏
  • 举报
回复
我表示不知道~~~~~
xiyangyang508 2012-05-16
  • 打赏
  • 举报
回复
不重复的5个数其和必不相同,所以所有可能和的概率是相同的:1/可能是组合总数
520yunyuna 2012-05-16
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]

可能出现的和比较好算:
最小值1+2+3+4+5=15
最大值15+14+13+12+11=65
中间值=65-(65-15)/2=40
各个和出现的次数思路比较复杂,直接写结果:
N15=1次
N16=N15+0=1
N17=N16+N15=2
N40最大,后面反过来
N41=N39
。。。
N65=N15
各个和出现的次数算出来了 概率就出来了
[/Quote]
“N17 = N16 + 15“,弱弱地问一句,这个是怎么得出来的?
bugers 2012-05-16
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 的回复:]
引用 18 楼 的回复:

可能出现的和比较好算:
最小值1+2+3+4+5=15
最大值15+14+13+12+11=65
中间值=65-(65-15)/2=40
各个和出现的次数思路比较复杂,直接写结果:
N15=1次
N16=N15+0=1
N17=N16+N15=2
N40最大,后面反过来
N41=N39
。。。
N65=N15
各个和出现的次数算出来了 概率就……
[/Quote]

各个和出现的次数不对抱歉
bugers 2012-05-16
  • 打赏
  • 举报
回复
可能出现的和比较好算:
最小值1+2+3+4+5=15
最大值15+14+13+12+11=65
中间值=65-(65-15)/2=40
各个和出现的次数思路比较复杂,直接写结果:
N15=1次
N16=N15+0=1
N17=N16+N15=2
N40最大,后面反过来
N41=N39
。。。
N65=N15
各个和出现的次数算出来了 概率就出来了

qldsrx 2012-05-16
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 的回复:]

引用 9 楼 的回复:

List<int> sum = new List<int>();
for (int i = 1; i <= 15; i++)
sum.Add(i);
var s = from t1 in sum
from t2 in sum
from t3 in sum
……

刚测试了一下,发生System.OutOfMemoryException异常!
耗费……
[/Quote]
哈哈,我之前也没仔细看,这家伙的代码写得真够烂的,一看就知道是滥用Linq,本身Linq效率是最低的,用在算法上是不可行的,而即便使用Linq也不能这样写。
正确的做法应该是嵌套循环5次,要用Linq写的话,则是嵌套5次,不过效率非常低,不推荐。
第一层循环是从1~11循环取值x1,第二层循环是从x1+1~12取值x2,第三层循环是x2+1~13循环取值x3,以此类推。
threenewbee 2012-05-15
  • 打赏
  • 举报
回复
要求不高的话可以用蒙特卡洛法拟合。
520yunyuna 2012-05-15
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]

http://baike.baidu.com/view/1419652.htm
[/Quote]
正态分布懂些,这个算法的提出,有部分因素是因为它!
可怎么具体到问题的解决,感觉有棘手!
threenewbee 2012-05-15
  • 打赏
  • 举报
回复
http://baike.baidu.com/view/1419652.htm
520yunyuna 2012-05-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

既然你问的是所有可能值的概率,那么必然需要把所有的可能值都计算一般,因此没有更高效的算法。
如果你仅仅需要求某一个可能值出现的概率,而不需要所有值的概率,那么可以提高下算法,仅计算该值的组合几率。
[/Quote]
恩。谢谢。
那某一个可能值的算法具体怎么做?比如和值为20个概率的算法!
threenewbee 2012-05-15
  • 打赏
  • 举报
回复
应该符合T分布。具体看下数学书吧。
qldsrx 2012-05-15
  • 打赏
  • 举报
回复
既然你问的是所有可能值的概率,那么必然需要把所有的可能值都计算一般,因此没有更高效的算法。
如果你仅仅需要求某一个可能值出现的概率,而不需要所有值的概率,那么可以提高下算法,仅计算该值的组合几率。
520yunyuna 2012-05-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

List<int> sum = new List<int>();
for (int i = 1; i <= 15; i++)
sum.Add(i);
var s = from t1 in sum
from t2 in sum
from t3 in sum
……
[/Quote]
谢谢!请问还有更高效的算法?
  • 打赏
  • 举报
回复
List<int> sum = new List<int>();
for (int i = 1; i <= 15; i++)
sum.Add(i);
var s = from t1 in sum
from t2 in sum
from t3 in sum
from t4 in sum
from t5 in sum
where t1 != t2 && t1 != t3 && t1 != t4 && t1 != t5 && t2 != t3 && t2 != t4 && t2 != t5 && t3 != t4 && t3 != t5 && t4 != t5
select new { sum = t1 + t2 + t3 + t4 + t5 };
int sumcount = s.Count();
var source = from temp in s group s by temp.sum into g select new { g,key=g.Key, count = g.Count() };
DataTable dt = new DataTable();
dt.Columns.Add("和", typeof(int));
dt.Columns.Add("概率", typeof(double));
dt.Columns.Add("出现次数", typeof(int));
foreach (var temp in source)
{
DataRow dr = dt.NewRow();
dr["和"] = temp.key;
dr["概率"] = temp.count / Convert.ToDouble(sumcount);
dr["出现次数"] = temp.count;
dt.Rows.Add(dr);
}
GridView1.DataSource = dt;
GridView1.DataBind();
anzhiqiang_touzi 2012-05-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
不放回的取5个数,相当于C15 5=(15*14*13*12*11)/(5*4*3*2*1)中取法
每种取法的5个数的和的概率应该一样吧1/C15 5
[/Quote]
方法是对的
520yunyuna 2012-05-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 5 楼 的回复:

引用 3 楼 的回复:

不放回的取5个数,相当于C15 5=(15*14*13*12*11)/(5*4*3*2*1)中取法
每种取法的5个数的和的概率应该一样吧1/C15 5

不是这样的,呵呵!
绝大数取法的和值是相等的。
比如1-4中取2个数,有6种可能:1,2;1,3;1,4;2,3;2,4;3,4.
其和的所有可能值为3、4、5、6、7……
[/Quote]
这样是可以实现,但是这种算法很“笨”,不高效啊!
加载更多回复(6)

111,126

社区成员

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

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

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