List的问题

wc_ling 2018-09-03 05:27:55
一个List<int> count是15 想将这个List的count补充到20,增加的5个要均匀的取List中的数据来补充 类似重采样的算法,谁有好办法?
...全文
657 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
晨易夕 2018-09-04
  • 打赏
  • 举报
回复
均匀地取应该叫抽稀吧。
lquk 2018-09-04
  • 打赏
  • 举报
回复
简单弄一弄,取出list数据平均数,平均数上下加n获得一个范围,生成此范围内5个随机数
xuzuning 2018-09-04
  • 打赏
  • 举报
回复
1,2,3, 5,2,4, 9,34,21, 53,11,1, 4,2,4
1,2,3,3,5,2,4,4,9,34,21,21,53,11,1,1,4,2,4,4
wc_ling 2018-09-04
  • 打赏
  • 举报
回复
这样的完美了

List<int> _lst=new List<int>{1,2,3,5,2,4,9,34,21,53,11,1,4,2,4}; //随机长度的list,但不会超过20
var n = _lst.Count / (20 - _lst.Count);
while(n == 0)
{
for (var j = 0;j < lst.Count; j++)
{
lst.Insert(j, lst[j++]);
}
n = lst.Count / (int.Parse(textBox1.Text) - lst.Count);
}
var rand = new Random();
for (var i = rand.Next(0, n); i < 20; i+=n)
{
_lst.Insert(i, _lst[i++]);
}
Console.WriteLine(string.Join(",", _lst));
by_封爱 版主 2018-09-04
  • 打赏
  • 举报
回复
既然你文中提到 "每个区域都取到" 这个每个区域 你又是根据什么来划分的呢?

按照你的数据来说 我只能按照大小来排序 来"填充"你所谓的"每个区域".

而且你需要5个数字 那么就应该从这个区域里划分5个小区 来取 这才能保证"均匀"吧...所以 我不知道你那3个2是怎么来的.
by_封爱 版主 2018-09-04
  • 打赏
  • 举报
回复
你看下你俩个数据..

A=1,1,2,2,2,______3,4,4,4,5,9,11,___21,34,___53
B=1,1,2,2,2,2,2,2,3,4,4,4,5,9,11,11,21,34,34,53

多了
C=2,2,2,11,34

那么你怎么证明 你的C是A的"均匀值" ?
wc_ling 2018-09-04
  • 打赏
  • 举报
回复
[quote=引用 8 楼 xuzuning 的回复:]
嗯,是有毛病!
应该这样[code=csharp] List<int> _lst=new List<int>{1,2,3,5,2,4};
var n = _lst.Count / (20 - _lst.Count);
var rand = new Random();
for (var i = rand.Next(0, n); i < 20; i+=n)
{
_lst.Insert(i, _lst[i++]);
}
Console.WriteLine(string.Join(",", _lst));


这种情况也不对
by_封爱 版主 2018-09-04
  • 打赏
  • 举报
回复
那这样吧..

先用20-15 得到5个.

然后既然要均匀 就把你之前的数据排序并且分成5组 也就是 15/5 每组3个数.

得到

1,1,2,
2,2,3,
4,4,4,
5,9,11,
21,34,53

然后取"中间"那个.. 也就是 1 2 4 9 34

得到 1,2,3,5,2,4,9,34,21,53,11,1,4,2,4,1,2 ,4, 9, 34

排序后 是
1,1,1,2,2,2,2,3,4,4,4,4,5,9,9,11,21,34,34,53
跟你 1,2,2,3,5,2,2,4,9,34,34,21,53,11,11,1,4,2,2,4 排序后
1,1,2,2,2,2,2,2,3,4,4,4,5,9,11,11,21,34,34,53

好像不一样..
xuzuning 2018-09-04
  • 打赏
  • 举报
回复
嗯,是有毛病!
应该这样
            List<int> _lst=new List<int>{1,2,3,5,2,4,9,34,21,53,11,1,4,2,4}; //这个_lst.count是15
var n = _lst.Count / (20 - _lst.Count);
var rand = new Random();
for (var i = rand.Next(0, n); i < 20; i+=n)
{
_lst.Insert(i, _lst[i++]);
}
Console.WriteLine(string.Join(",", _lst));
1,2,3,3,5,2,4,4,9,34,21,21,53,11,1,1,4,2,4,4
xuzuning 2018-09-04
  • 打赏
  • 举报
回复
你并未理解我说的算法
            List<int> _lst=new List<int>{1,2,3,5,2,4,9,34,21,53,11,1,4,2,4}; //这个_lst.count是15
var n = _lst.Count / (20 - _lst.Count);
var rand = new Random();
for (var i = rand.Next(0, n); i < 20; i++)
{
if (i % n == 0) _lst.Insert(i, _lst[i++]);
}
Console.WriteLine(string.Join(",", _lst));
1,1,2,3,3,5,2,2,4,9,9,34,21,21,53,11,11,1,4,4,2,4
wc_ling 2018-09-04
  • 打赏
  • 举报
回复
各位可能没明白我的意思,这举个例子吧
List<int> _lst=new List<int>{1,2,3,5,2,4,9,34,21,53,11,1,4,2,4}; 这个_lst.count是15
现在要对其补充到20,其补充的数据要从其本身的list值来取得。那么怎么取呢,取哪些呢?
这就要提出所谓的均匀取值的问题了,所以均匀取值,就是让你所取的数据在_lst里尽量每个区域都取到,其取出的结果大概就是这样
List<int> _newlst=new <int>{1,2,2,3,5,2,2,4,9,34,34,21,53,11,11,1,4,2,2,4}
对比两个list,大家就会看出我的意思了吧
threenewbee 2018-09-03
  • 打赏
  • 举报
回复
list = list.Concat(list.OrderBy(x => Guid.NewGuid()).Take(5)).ToList();
xuzuning 2018-09-03
  • 打赏
  • 举报
回复
依据抽样理论,对原序列做随机等距抽样,其结果可在最大程度上保持原序列的变化趋势
只是用 Liqn 不易表述(本人无此能力)中鞥用 for 循环
var n = 15/(20-15);
var rand = new Random();
for(var i=rand.Next(0,n); i < list.Count; i++)
{
if(i % n == 0) list.Insert(i, list[i++]);
}
正怒月神 2018-09-03
  • 打赏
  • 举报
回复
均匀的取是什么意思。
下面这个是随即取值
List<int> test = new List<int>() { 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 };
test.AddRange(test.OrderBy(x => Guid.NewGuid()).Take(5));
  • 打赏
  • 举报
回复
均匀的取是什么意思?难道group下,然后按每组数组多少来反向添加?

110,561

社区成员

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

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

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