比如总金额是100元,60人抢,要求将100元分成60分,最小单位分,不重复。可以设置最大和最小红包,同时满足红包金额向中间靠拢。
给100元烟钱酬劳,没别的意思,希望做过的朋友帮帮忙。
请直接给C#代码。谢谢
//这里金额随机在平均金额的0.01到2倍之间
public decimal[] GetList()
{
decimal total = 100;
int count = 60;
decimal avg = total / count;
decimal[] list = new decimal[60];
int seed = 1;
while (count > 0)
{
if (count == 1)
{
list[60 - count] = Math.Round(total,2);
count--;
}
else
{
//avg = total / count;
Random r = new Random(seed);
decimal lv = (decimal)r.Next(200) / 100;
if (total - avg * lv <= 0)
{
int a = 1;
seed++;
continue;
}
list[60 - count] = Math.Round(avg * lv,2,MidpointRounding.AwayFromZero);
total -= Math.Round(avg * lv, 2, MidpointRounding.AwayFromZero);
count--;
}
seed++;
}
decimal jisuan = 0;
for (int i = 0; i < 60; i++)
jisuan += list[i];
return list;
}
兄弟,能稍威改一下你的代码吗?把最小值0.01改成0.15元,最大值改为0.50元。如果全部改为int类型的更好,因为用分为单位,不需要考虑小数点的问题。顺便留下的微信,我发红包给你。
最好能满足正态分布,谢谢!
@小徐的博客: 你厉害,最大值0.5,60个人撑死也只能领30元,剩下的70,你要黑吃?
@幻天芒: 我只是随俩举个例子,说几个数字而已。
@小徐的博客: 要满足正态分布需要网上找个算法,不过感觉不那么准,高数也都还给老师了,你可以去看看怎么讲均匀分布转换成正态分布的例子,我就不帮你找啦。。(最大值和最小值可以在设置lv这个字段,我是写成了2倍)。。
@green hand: 如果设置最小值,容易出现钱不够的现象。这里一直没解决。还请帮帮忙。谢谢。不需要考虑正态分布。
我没做过,用随机数可以吧
这种题倒是难不倒我,可惜我又不抽烟。
反正我发红包给你啊,帮个忙兄弟
巍哥,来根烟..