一个简单的随机概率问题

.Net技术 码拜 8年前 (2016-03-03) 672次浏览
RT
N=100
怎么把N分为不规则的100份  从大到小的递归排序
输出效果为(100个不规则的数字):10(固定)  8  7  5 3  2 ……0.01
解决方案

10

Random rnd = new Random();
int nCount = 100;
int n = 10;
double[] dArr = new double[n];
double dBase = (double)nCount / n;
//默认都是一样的
for (int i = 0; i < n; i++) dArr[i] = dBase;
for (int i = 0; i < n / 2; i++) {
    //生成 0 - dbase 之间的随机数
    double d = rnd.NextDouble() * dBase;
    dArr[i] -= d;         //其中一个减掉d 另一个加上d
    dArr[n - 1 - i] += d;
}
Array.Sort(dArr);
foreach (var v in dArr)
    Console.WriteLine(v);
//===============
3.20536261108022
3.23604574577699
5.6426536923473
6.24905226111834
8.57602051858605
11.423979481414
13.7509477388817
14.3573463076527
16.763954254223
16.7946373889198

10

这不就是换算成
总数X=100*100
随机分成 Y=100份
最大值为10*100(不懂固定是什么意思,是必定会有,还是最大只允许这个)
最小值为1
简单的就是Z=Random(10*100),然后循环X-Z,假如剩余值>剩余次数*1,那么就还可以继续Random,否则就是剩余的全都是1

5

http://www.zhihu.com/question/22625187
这些专门搞算法的画的图本人看都看不懂一个简单的随机概率问题

20

哦,竟然还有 0.01。真够抠门的。
假如不考虑“最大为10”这个条件,其实可以产生100个随机数值,假设其合计是s,那么就再把没一个数值都乘以 100.0/s。但是这不保证最小值恰好是0.01、最大值恰好是10。并且其实看起来不应该是随机正态分布,那样才好玩儿一点。

5

不应该是随机正态分布  –>   不应该是随机均匀分布
要想保证最小值必须是 0.01、最大值必须是10,那么其实就是计算另外 98 个值了,而且其区间必须在0~9.99之间,合计恰好为89.99。
本人写一个“随机均匀分布”的例子

var rnd = new Random();
var datas = (from n in Enumerable.Range(0, 98) select 0.01 * rnd.Next(100, 1000)).ToList();
var p = 89.99 / datas.Sum(); 
datas = (from n in datas select p * n).ToList();
datas.Add(10);
datas.Add(0.01);
datas = datas.OrderByDescending(x => x).ToList();

显然这里是随机均匀分布的,不好玩!

50

实际的业务处理肯定不会随随便便地说“分为不规则的100份”这么简单的话。说这么简单,那么肯定就“不好玩儿”了,肯定没有领会人家设计的初衷。人家的数据设计,肯定是有一些“分布”曲线模式,而不是均匀分布的。那么这里的重点就在这个模式。
而你对需求的描述,似乎一点也没有涉及到数据分布模式的说明。
人家的系统的“拆分”可能远没有你在问题中说明的这个简单规则。所以你无法模仿人家,原因是你不懂人家的规则。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明一个简单的随机概率问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)