一个简单的随机概率问题

o_Sara 2016-06-07 04:47:59
RT
N=100

怎么把N分为不规则的100份 从大到小的递归排序

输出效果为(100个不规则的数字):10(固定) 8 7 5 3 2 ......0.01
...全文
264 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
实际的业务处理肯定不会随随便便地说“分为不规则的100份”这么简单的话。说这么简单,那么肯定就“不好玩儿”了,肯定没有领会人家设计的初衷。人家的数据设计,肯定是有一些“分布”曲线模式,而不是均匀分布的。那么这里的重点就在这个模式。 而你对需求的描述,似乎一点也没有涉及到数据分布模式的说明。 人家的系统的“拆分”可能远没有你在问题中说明的这个简单规则。所以你无法模仿人家,因为你不懂人家的规则。
  • 打赏
  • 举报
回复
不应该是随机正态分布 --> 不应该是随机均匀分布 要想保证最小值必须是 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();
显然这里是随机均匀分布的,不好玩!
crystal_lz 2016-06-07
  • 打赏
  • 举报
回复
引用 4 楼 o_Sara 的回复:
可能我描述的不够清楚 规则 1,把100分为不规则的100份 由大到小排列 即 100个不规则的数字 可以是小数 2,生成的不规则数总和等于100 [quote=引用 2 楼 crystal_lz 的回复:]

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
[/quote] 看来你要的不是思路 而是直接现成的代码。。。
  • 打赏
  • 举报
回复
哦,竟然还有 0.01。真够抠门的。 如果不考虑“最大为10”这个条件,其实可以产生100个随机数值,假设其合计是s,那么就再把没一个数值都乘以 100.0/s。但是这不保证最小值恰好是0.01、最大值恰好是10。并且其实看起来不应该是随机正态分布,那样才好玩儿一点。
  • 打赏
  • 举报
回复
你的 N 应该不小于 1000 吧?
  • 打赏
  • 举报
回复
http://www.zhihu.com/question/22625187 这些专门搞算法的画的图我看都看不懂
  • 打赏
  • 举报
回复
这不就是换算成 总数X=100*100 随机分成 Y=100份 最大值为10*100(不懂固定是什么意思,是必定会有,还是最大只允许这个) 最小值为1 简单的就是Z=Random(10*100),然后循环X-Z,如果剩余值>剩余次数*1,那么就还可以继续Random,否则就是剩余的全都是1
o_Sara 2016-06-07
  • 打赏
  • 举报
回复
类似吧 ,但不是发红包 版主
引用 3 楼 xuzuning 的回复:
微信红包???
o_Sara 2016-06-07
  • 打赏
  • 举报
回复
可能我描述的不够清楚 规则 1,把100分为不规则的100份 由大到小排列 即 100个不规则的数字 可以是小数 2,生成的不规则数总和等于100
引用 2 楼 crystal_lz 的回复:

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
xuzuning 2016-06-07
  • 打赏
  • 举报
回复
微信红包???
crystal_lz 2016-06-07
  • 打赏
  • 举报
回复

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
o_Sara 2016-06-07
  • 打赏
  • 举报
回复
生成的数总和为N

110,567

社区成员

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

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

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