100分求一个随机数生成算法

程序员周瑜 2015-08-01 06:12:24
500000元分给1000000个人,每个人分0.18到88元,正好分完。请问如何使用算法实现?
...全文
1055 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanran_hill 2015-08-05
  • 打赏
  • 举报
回复
最近比较偏爱直方图,尝试用直方图方式初始化数组:

// decimal取值:0.18 to 88
Dicationary<decimal,int> peoples = new Dicationary<deimal,int>();
decimal leftMoney = 500000;
int leftPeoples = 1000000;

Random random = new Random()

for (decimal offset = 0.18; offset<=88; offset+=0.01)
{
    int peopleSize=0;
    if(leftPeoples <1)
    {
        peoples[offset] = 0;
    }
    else 
    {
        do 
        {
            peopleSize= random.Next((int)(leftMoney/offset));
        } while( peopleSize <= leftPeoples );
        peoples[offset] = perpleSize;
        leftMoney -= perpleSize*offset;
        leftPeoples  -= peopleSize;
    }
}
//总计循环次数:8800-18次
fantasykakaxi 2015-08-05
  • 打赏
  • 举报
回复
我是进来看大神的回复 好好学习
Heart09 2015-08-05
  • 打赏
  • 举报
回复
我的看法: 首先我的思路要是动态分配的,不能一开始就分配好! 设分配最低额为min,分配最高额为max; 剩余金额(初始为总金额)为totalMoney,剩余人数(初始为总人数)为totalPerson。 随时要保证 min * totalPerson <= totalMoney <= max * totalPerson,设这个为必要条件A 循环从这里开始 每次随机出一个[min, max]区间的数tmpRandom, 计算totalMoney减去tmpRandom之得到的结果,做条件A的判断,如果满足,则分配成功,如果不满足,则分配失败。 分配之后 ,将totalPerson -= 1,totalMoney -= tmpRandom。 然后判断: 如果 totalMoney == min * totalPerson, 则剩下的人都分min 若果 totalMoney == max * totalPerson,则剩下的人都分max 否则 继续上面的循环。 ---------------------- 个人见解 楼主你那个100分一点都不诱人 一个论坛积分换一个idea,你真会算!
InSpirit1 2015-08-05
  • 打赏
  • 举报
回复
随机生成区间在0.18到88的数字,再用50000-这个数字并保存,
引用 22 楼 sp1234 的回复:
标题是 lz 瞎编的,分配红包金额不可能有什么“随机”算法。一个自己瞎编的标题误导了很多只看标题不看设计内容要求的人。
稍安勿躁吧,LZ的命题其实就是各大平台在搞的抢红包活动,别说50W块钱分给100W人有人能分88块,
引用 17 楼 sp1234 的回复:
首先,你这个题目是100万人分这么点钱,还能分到88元?估计是你的题目写错了,把0.88写成88了。 如果是正好分配,可以这样计算
var 金额 = 500000;
int 人数 = 1000000;
var a1 = 0.18;
//等差数列求和    金额=a1*人数+(人数-1)*人数*d/2
var d = 2 * (金额 - a1 * 人数) / (1.0 * 人数 * (人数 - 1));
decimal a = (decimal)a1;
decimal sum = a;
List<decimal> result = new List<decimal>(人数) { a };
for (var i = 1; i < 人数 - 1; ++i)
{
    a1 += d;
    a = Math.Round((decimal)a1, 2);      //舍掉毫厘
    result.Add(a);
    sum += a;
}
result.Add(((decimal)金额) - sum);   //最后一人分得的
最后两人分得的都是 0.82 元。
LZ的命题其实就是各大平台在搞的抢红包活动,别说50W块钱分给100W个人有人能分到88块,888也是可以的呀
DreamLife. 2015-08-05
  • 打赏
  • 举报
回复
引用 2 楼 ldmxyzldm的回复:
我给一个思路吧。 其实把500000分给1000000个人和把100分给10个的思路是一样的。 请看好我的逻辑关系:先把500000分给10个人,然后将把每个人的钱再次分给10个人,依次下去。最后分到的人数就是10的n次方! 而1000000就是10的6次方! 所以最重要的是写出X的钱分给10个人的算法。 然后再用for循环进行6次循环就可以。
我喜欢这个思路
魂之挽歌来袭 2015-08-04
  • 打赏
  • 举报
回复
/** * 微信红包分配算法 * * @author Michael282694 * */ public class wechat_money { public static void main(String[] args) { // TODO Auto-generated method stub double total_money; // 红包总金额 int total_people; // 抢红包总人数 double min_money; // 每个人最少能收到0.01元 total_money = 10.0; total_people = 8; min_money = 0.01; for (int i = 0; i < total_people - 1; i++) { int j = i + 1; double safe_money = (total_money - (total_people - j) * min_money) / (total_people - j); double tmp_money = (Math.random() * (safe_money * 100 - min_money * 100) + min_money * 100) / 100; total_money = total_money - tmp_money; System.out.format("第 %d 个红包: %.2f 元,剩下: %.2f 元\n", j, tmp_money, total_money); } System.out.format("第 %d 个红包: %.2f 元,剩下: 0 元\n", total_people, total_money); } }
  • 打赏
  • 举报
回复
引用 20 楼 u010226845 的回复:
[quote=引用 4楼娃都会打酱油了 的回复:]不会就是抄微信红包吧? 如果是的话,你得确认是一次性分完,还是一个个分,这两种算法有差异的
你好,一次性分完是怎么个办法呀?我怎么感觉微信红包都是一个一个分的[/quote] 一个个分就是一次次去随机,然后按情况每次都可能需要做修正 一次性分完就是我先不分配,只管生成分配数据(这时候还不跟人挂钩,只是知道要分给多少人),最后再将人随机排序后与已经全部生成好了的金额做对应
  • 打赏
  • 举报
回复
标题是 lz 瞎编的,分配红包金额不可能有什么“随机”算法。一个自己瞎编的标题误导了很多只看标题不看设计内容要求的人。
谁说我头大 2015-08-04
  • 打赏
  • 举报
回复
引用 6 楼 wanghui0380的回复:
遗传递归优化 一次产生100000个数,如果排除掉不符合规则的,并记录个数和sum数 然后第二代遗传,重复操作,直至整个种群都符合规则
我觉得六楼的方法可行
Yanphet 2015-08-04
  • 打赏
  • 举报
回复
引用 4楼娃都会打酱油了 的回复:
不会就是抄微信红包吧? 如果是的话,你得确认是一次性分完,还是一个个分,这两种算法有差异的
你好,一次性分完是怎么个办法呀?我怎么感觉微信红包都是一个一个分的
gw6328 2015-08-04
  • 打赏
  • 举报
回复
我感觉不是随机的。 我想了一个,先计算一个全部的平均数,然后再通过随机数来修改,两个人一组,一个人加上这个数机数,另外一个人就减去一个随机数,但是可能不是0.18~88. 有了这个限制可能就不随机了。 分配可以不随机,主要是发送的时候随机就可以了。每个人得到最大的可能性是一样的。
SteveWz 2015-08-04
  • 打赏
  • 举报
回复
红包分配法?我是进来学习的
  • 打赏
  • 举报
回复
如果你硬说“有一个人要正好分88元”,那么你把 500000-88元钱先等差分摊给999999个人,然后最后给剩下的一个人分配88好了!所以“分配88元”很可能是不合理的要求,是写错了。
  • 打赏
  • 举报
回复
这里的陷阱,估计就是
var d = 2 * (金额 - a1 * 人数) / (1.0 * 人数 * (人数 - 1));
这里。当我没有写1.0的时候(使用整数做分母的时候),误差很大。
  • 打赏
  • 举报
回复
首先,你这个题目是100万人分这么点钱,还能分到88元?估计是你的题目写错了,把0.88写成88了。 如果是正好分配,可以这样计算
var 金额 = 500000;
int 人数 = 1000000;
var a1 = 0.18;
//等差数列求和    金额=a1*人数+(人数-1)*人数*d/2
var d = 2 * (金额 - a1 * 人数) / (1.0 * 人数 * (人数 - 1));
decimal a = (decimal)a1;
decimal sum = a;
List<decimal> result = new List<decimal>(人数) { a };
for (var i = 1; i < 人数 - 1; ++i)
{
    a1 += d;
    a = Math.Round((decimal)a1, 2);      //舍掉毫厘
    result.Add(a);
    sum += a;
}
result.Add(((decimal)金额) - sum);   //最后一人分得的
最后两人分得的都是 0.82 元。
wanghui0380 2015-08-03
  • 打赏
  • 举报
回复
遗传递归优化 一次产生100000个数,如果排除掉不符合规则的,并记录个数和sum数 然后第二代遗传,重复操作,直至整个种群都符合规则
devmiao 2015-08-03
  • 打赏
  • 举报
回复
首先不管总和随机产生一批随机数,得到一个总和,然后对每个数按比例缩放。
Poopaye 2015-08-03
  • 打赏
  • 举报
回复
每个人分到的钱的多少有没有一定的比例关系?
  • 打赏
  • 举报
回复
不会就是抄微信红包吧? 如果是的话,你得确认是一次性分完,还是一个个分,这两种算法有差异的
於黾 2015-08-03
  • 打赏
  • 举报
回复
每个人分0.18到88元 都没说中间到底有几个档次 如果仅仅是0.18到88的任意数,直接做个除法不就行了 如果你还想每个人分到的钱数不同 那么就循环一下,每次生成个随机数,每个人扣掉一部分钱给下一个人.
加载更多回复(10)
随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数生成算法随机数

110,533

社区成员

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

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

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