数据按比例分配

szhda4le 2017-05-07 08:27:17
有多个通道
可以设置占比 如30% 30% 40%
现在一条数据进来 序号每天重置 每天从1开始递增
怎么把这条数据 按照所设置的比例分配到不同通道中
最好不要在通道中计数
我按照 取模的方式 总觉得不是很准确
有没有其他号的办法 谢谢
...全文
1241 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
szhda4le 2018-11-01
  • 打赏
  • 举报
回复
引用 18 楼 lzming1988 的回复:
我觉得题主的意思应该是:很长的一段时间维度上,随着数据总量的积累,最终分配的比例是A30% B30% C40%,但一次执行数据分配的时候不限定数据条数。

@szhda4le 现在是怎么解决的???跪求 或者有时间一起来交流交流


 public class Choose
{
/// <summary>
/// 使用的选择
/// </summary>
private int currentIndex = -1;

/// <summary>
/// 使用的权重
/// </summary>
private int currentWeight = 0;

/// <summary>
/// 权重的最大公约数
/// </summary>
private int gcdWeight;

/// <summary>
/// 权重总和
/// </summary>
private int sumWeight;

/// <summary>
/// 最大权重
/// </summary>
private int maxWeight;


/// <summary>
/// 权重数量
/// </summary>
private Dictionary<int, int> dic = new Dictionary<int, int>
{
{ 1, 3 },
{ 2, 3 },
{ 3, 4 }
};
/// <summary>
/// 权重数量
/// </summary>
private int count;
public Choose()
{

count = dic.Count;
maxWeight = dic.Values.Max();
var weightArray = dic.Values.ToArray();
gcdWeight = 1; //计算最大公约数GetDivisor(weightArray);
sumWeight = weightArray.Sum();
}

public int GetKey(int nums)
{
int dicKey = 0;
nums = nums % sumWeight == 0 ? sumWeight : nums % sumWeight;
int count = 0;
while (count != nums)
{
count++;
dicKey = GetKey();
}
return dicKey;
}

private int GetKey()
{
while (true)
{
currentIndex = (currentIndex + 1) % count;
if (currentIndex == 0)
{
currentWeight = currentWeight - gcdWeight;
if (currentWeight <= 0)
{
currentWeight = maxWeight;

if (currentWeight == 0)
{
return 0;
}
}
}
if (dic[currentIndex] >= currentWeight)
{
return dic[currentIndex];
}
}
}

}


差不多是这个意思
ilzming 2017-05-23
  • 打赏
  • 举报
回复
我觉得题主的意思应该是:很长的一段时间维度上,随着数据总量的积累,最终分配的比例是A30% B30% C40%,但一次执行数据分配的时候不限定数据条数。 @szhda4le 现在是怎么解决的???跪求 或者有时间一起来交流交流
ggw 2017-05-23
  • 打赏
  • 举报
回复
百分比分就行了。
threenewbee 2017-05-08
  • 打赏
  • 举报
回复
id % 10,如果是1-3,那么1通道4-6,那么2通道,其余3通道
  • 打赏
  • 举报
回复
引用 7 楼 szhda4le 的回复:
你好 是这样的 我想的是 比如分班 A B C 3个班 20% 30% 50% 有多少人参与分配不确定 学生依次报名 %的话 如果报名10个人 100个人最后结果是没问题的 如果只来3个人 那么A班2个 B班1个 觉得这样不怎么准确 我想问问 有没有什么算法 能够 3个班级轮着分配 比如 第1个学生 C班 第2个 B班 第3个 C班 第4个 A班 类似这个意思 不一定准确
你说的“有多少人参与分配不确定”这本身就是问题。如果硬要你那种“准确”,那么就死板地定死了有多少人参与分配。 你自己存在着不确定性,却要求别人给你一个“准确的”A班出来,出题者不靠谱却要求答案靠谱,怎么回答? 如果你遵循一个概率思想来考虑,这个问题就容易。如果你偷换概率概念,那么就只能死板地直接指定结果。
打老虎zz 2017-05-08
  • 打赏
  • 举报
回复
引用 13 楼 szhda4le 的回复:
[quote=引用 12 楼 woainixinxin521 的回复:] [quote=引用 7 楼 szhda4le 的回复:] [quote=引用 5 楼 sp1234 的回复:] [quote=引用 3 楼 szhda4le 的回复:] 我用的就是这种 想知道 有没有别的方式 总觉得这种不是很准确 而且 比例分配的时候 可能出现33 37这种
“准确”是怎么分? 这个跟编程没有关系。说说你的生活常识,怎么保证“准确”的?如果不懂编程的人能明白了,再来考虑编程问题。[/quote] 你好 是这样的 我想的是 比如分班 A B C 3个班 20% 30% 50% 有多少人参与分配不确定 学生依次报名 %的话 如果报名10个人 100个人最后结果是没问题的 如果只来3个人 那么A班2个 B班1个 觉得这样不怎么准确 我想问问 有没有什么算法 能够 3个班级轮着分配 比如 第1个学生 C班 第2个 B班 第3个 C班 第4个 A班 类似这个意思 不一定准确 [/quote] 你现在这个需求 所谓的分配比例本身就有问题 那如果1个人报名 你是不是要把这个人杀了?[/quote] 1个人的话 按照最大比例 是C班啊 [/quote] 不能先确定报名人数 然后按照比例控制去分班 ?
szhda4le 2017-05-08
  • 打赏
  • 举报
回复
引用 12 楼 woainixinxin521 的回复:
[quote=引用 7 楼 szhda4le 的回复:] [quote=引用 5 楼 sp1234 的回复:] [quote=引用 3 楼 szhda4le 的回复:] 我用的就是这种 想知道 有没有别的方式 总觉得这种不是很准确 而且 比例分配的时候 可能出现33 37这种
“准确”是怎么分? 这个跟编程没有关系。说说你的生活常识,怎么保证“准确”的?如果不懂编程的人能明白了,再来考虑编程问题。[/quote] 你好 是这样的 我想的是 比如分班 A B C 3个班 20% 30% 50% 有多少人参与分配不确定 学生依次报名 %的话 如果报名10个人 100个人最后结果是没问题的 如果只来3个人 那么A班2个 B班1个 觉得这样不怎么准确 我想问问 有没有什么算法 能够 3个班级轮着分配 比如 第1个学生 C班 第2个 B班 第3个 C班 第4个 A班 类似这个意思 不一定准确 [/quote] 你现在这个需求 所谓的分配比例本身就有问题 那如果1个人报名 你是不是要把这个人杀了?[/quote] 1个人的话 按照最大比例 是C班啊
打老虎zz 2017-05-08
  • 打赏
  • 举报
回复
引用 7 楼 szhda4le 的回复:
[quote=引用 5 楼 sp1234 的回复:] [quote=引用 3 楼 szhda4le 的回复:] 我用的就是这种 想知道 有没有别的方式 总觉得这种不是很准确 而且 比例分配的时候 可能出现33 37这种
“准确”是怎么分? 这个跟编程没有关系。说说你的生活常识,怎么保证“准确”的?如果不懂编程的人能明白了,再来考虑编程问题。[/quote] 你好 是这样的 我想的是 比如分班 A B C 3个班 20% 30% 50% 有多少人参与分配不确定 学生依次报名 %的话 如果报名10个人 100个人最后结果是没问题的 如果只来3个人 那么A班2个 B班1个 觉得这样不怎么准确 我想问问 有没有什么算法 能够 3个班级轮着分配 比如 第1个学生 C班 第2个 B班 第3个 C班 第4个 A班 类似这个意思 不一定准确 [/quote] 你现在这个需求 所谓的分配比例本身就有问题 那如果1个人报名 你是不是要把这个人杀了?
程序员-阿勇 2017-05-08
  • 打赏
  • 举报
回复
引用 2 楼 caozhy 的回复:
id % 10,如果是1-3,那么1通道4-6,那么2通道,其余3通道
这种做法可以,按照id的尾数,为了防止只有三个人的情况全走一个渠道的情况,可以考虑1,3,6,9走一个渠道 2,4,7走一个渠道0,5,8走一个渠道,类似这样的
程序员-阿勇 2017-05-08
  • 打赏
  • 举报
回复
可以用随机数去分配,如随机数范围是0-10,按照上面的规则,是什么走走什么渠道,但是在小数据情况下,可能出现的c偶然性比较大,那我们就考虑规定死个位数的做法,但是在大数据的情况会更加靠近我们所设定的比例
程序员-阿勇 2017-05-08
  • 打赏
  • 举报
回复
这个比例比例问题,我们只能说尽可能去靠近我们所设想的比例,按照你这么说,那2个人,你怎么做到你这个比例?我们只能说按照这个规则尽可能的靠近那么比例吧
jiaxinglei01 2017-05-08
  • 打赏
  • 举报
回复
思路可以是 本班比例 - 当前本班人数 / 总数 取大于0且数值最小的 如C班有3个人 总数有10个人 0.5 - 3/10 在比较A B 的
ljheee 2017-05-08
  • 打赏
  • 举报
回复
一定数量的数据样本,按30% 30% 40% 比例,n*0.3就不一定是整数
szhda4le 2017-05-08
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
[quote=引用 3 楼 szhda4le 的回复:] 我用的就是这种 想知道 有没有别的方式 总觉得这种不是很准确 而且 比例分配的时候 可能出现33 37这种
“准确”是怎么分? 这个跟编程没有关系。说说你的生活常识,怎么保证“准确”的?如果不懂编程的人能明白了,再来考虑编程问题。[/quote] 你好 是这样的 我想的是 比如分班 A B C 3个班 20% 30% 50% 有多少人参与分配不确定 学生依次报名 %的话 如果报名10个人 100个人最后结果是没问题的 如果只来3个人 那么A班2个 B班1个 觉得这样不怎么准确 我想问问 有没有什么算法 能够 3个班级轮着分配 比如 第1个学生 C班 第2个 B班 第3个 C班 第4个 A班 类似这个意思 不一定准确
  • 打赏
  • 举报
回复
如果只是说一个百分比,而这种事情出现的次数又是计次的,那么其实就谈不上“准确”。 要所谓的“准确”就是要全死板地应对,也就是预先产生N个数字(这个N是预先知道的),越死板越“准确”。
  • 打赏
  • 举报
回复
引用 3 楼 szhda4le 的回复:
我用的就是这种 想知道 有没有别的方式 总觉得这种不是很准确 而且 比例分配的时候 可能出现33 37这种
“准确”是怎么分? 这个跟编程没有关系。说说你的生活常识,怎么保证“准确”的?如果不懂编程的人能明白了,再来考虑编程问题。
打老虎zz 2017-05-08
  • 打赏
  • 举报
回复
取余没问题啊 1 2 3 一个通道 4 5 6一个通道 7 8 9 0 一个通道 33 和37有什么关系呢 不就是 3 3 4 么
szhda4le 2017-05-08
  • 打赏
  • 举报
回复
引用 2 楼 caozhy 的回复:
id % 10,如果是1-3,那么1通道4-6,那么2通道,其余3通道
我用的就是这种 想知道 有没有别的方式 总觉得这种不是很准确 而且 比例分配的时候 可能出现33 37这种
youyiyang 2017-05-08
  • 打赏
  • 举报
回复
基本明白你的意思了。 这样试试可以吗? A: 20%=0.2 B:30%=0.3 C: 50%=0.5 第一次,就是第一个人 对于A来说 , 如果这唯一的一个人到A去的话,那么概率是100%=1,同时,B和C也是100%=1 对于A来说,1-0.2=0.8, 对于B来说,1-0.3=0.7. 对于C来说,1-0.5=0.5 可以看到这个差值是C最小,所以应该到C去。 第二次,就是来2个人 对于A来说,这个人到A去的话的概率是 1/2(这里的2是因为已经前后有2个人了)=0.5,B来说,概率也是1/2=0.5,对于C来说是2/2,这里分子是2是因为已经考虑到的第一个人已经到C来了,所以概率是1=100% 这样算一下差值。 对于A来说,0.5-0.2=0.3 对于B来说,0.5-0.3=0.2 对于C来说,1-0.5=0.5 可以看到B的差值最小,所以到B去, 第三次,就是来3个人 对于A来说的概率是1/3=0.33,对于B来说2/3=0.66,对于C来说2/3=0.66 算一下差值。 对于A来说是0.33-0.2=0.13 对于B来说是0.66-0.3=0.36 对于C来说是0.66-0.5=0.16 所以到A去。 以此类推,建立算法吧
szhda4le 2017-05-07
  • 打赏
  • 举报
回复
求不沉~~~~~~

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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