首页 新闻 搜索 专区 学院

求一个仿微信抢红包的算法,付100元烟钱酬劳哈。

0
悬赏园豆:5 [待解决问题]

比如总金额是100元,60人抢,要求将100元分成60分,最小单位分,不重复。可以设置最大和最小红包,同时满足红包金额向中间靠拢。

 

给100元烟钱酬劳,没别的意思,希望做过的朋友帮帮忙。

请直接给C#代码。谢谢

小徐的博客的主页 小徐的博客 | 初学一级 | 园豆:13
提问于:2016-05-25 14:18
< >
分享
所有回答(3)
0

我没做过,用随机数可以吧

小光 | 园豆:1880 (小虾三级) | 2016-05-25 14:49
0

这种题倒是难不倒我,可惜我又不抽烟。

上帝之城 | 园豆:2452 (老鸟四级) | 2016-05-25 15:11

反正我发红包给你啊,帮个忙兄弟

支持(0) 反对(0) 小徐的博客 | 园豆:13 (初学一级) | 2016-05-25 15:22

 巍哥,来根烟..

支持(0) 反对(0) 幻天芒 | 园豆:36662 (高人七级) | 2016-05-26 09:09
0

//这里金额随机在平均金额的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;
}

green hand | 园豆:191 (初学一级) | 2016-05-25 15:51

兄弟,能稍威改一下你的代码吗?把最小值0.01改成0.15元,最大值改为0.50元。如果全部改为int类型的更好,因为用分为单位,不需要考虑小数点的问题。顺便留下的微信,我发红包给你。

支持(0) 反对(0) 小徐的博客 | 园豆:13 (初学一级) | 2016-05-25 18:36

最好能满足正态分布,谢谢!

支持(0) 反对(0) 小徐的博客 | 园豆:13 (初学一级) | 2016-05-25 18:47

@小徐的博客: 你厉害,最大值0.5,60个人撑死也只能领30元,剩下的70,你要黑吃?

支持(0) 反对(0) 幻天芒 | 园豆:36662 (高人七级) | 2016-05-26 09:10

@幻天芒: 我只是随俩举个例子,说几个数字而已。

支持(0) 反对(0) 小徐的博客 | 园豆:13 (初学一级) | 2016-05-26 10:44

@小徐的博客: 要满足正态分布需要网上找个算法,不过感觉不那么准,高数也都还给老师了,你可以去看看怎么讲均匀分布转换成正态分布的例子,我就不帮你找啦。。(最大值和最小值可以在设置lv这个字段,我是写成了2倍)。。

支持(0) 反对(0) green hand | 园豆:191 (初学一级) | 2016-05-27 09:51

@green hand: 如果设置最小值,容易出现钱不够的现象。这里一直没解决。还请帮帮忙。谢谢。不需要考虑正态分布。

支持(0) 反对(0) 小徐的博客 | 园豆:13 (初学一级) | 2016-05-28 00:48
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册