0-100,随机取10个数的和为100的算法(后续补充2,彻底解决的方案+效率)

王志勇 发表于 2019年01月24日 12:27

有人说从事程序设计会短命(缩短寿命),我觉得确实有一定的道理。因为程序设计,工作量是巨量的,更多地是要花大量时间推算出很多的算法,如果不去推算,则无法完成任务。这种深度思考已经比别人大大提前消耗了精力,容易用脑过度,夜里一旦思考这些复杂的问题,容易睡不着,使褪黑素减少,所以影响健康。前一文我设想的算法,能够彻底解出来,由于暂时用不到,所以没有具体写出程序,因为完成这个程序至少得2-3小时。

我的这个算法的原理,就是先让程序自动列举出所有符合条件的10个数相加为100(不考虑排列顺序为66种),这时候时候可以不考虑10个数的排列顺序,消耗的服务器资源,循环次数大约仅为101*101。(其实不需要考虑循环多少次)

最后的2步,先随机拿出一个符合条件的10个数的组合。再将拿到的组合,再随机排列。这样,就完美解决“随机”数的需求。(特别是经过这2步的2次随机处理,产生随机数的种类的数量有几千种。)

如果数字可重复,程序反而复杂一些,但也能实现。

由于只循环了约101*101次,所以对服务器资源的消耗很小,消耗的时间约为0.01秒以内。这样的程序,适合于不太高频访问的程序。

对于高频访问的程序,可以事先建立一个后台页面,让其提前自动列举出、并将这66种组合存储在数据库。
下次在这个页面被访问的时候,直接从66种组合中随机拿出一组,再将10个数随机排列,这样,使用时完全没有了循环程序,程序效率提高了很多

这两天发现,如果一旦开始写这个程序,在提前筛选这66组数时,很可能循环的次数不是101*101。比如我们先假设从1-6取3个数,要求在不考虑顺序的情况下,数字不重复,得到的结果是:

1 2 3
1 2 4
1 2 5
1 2 6
1 3 4
1 3 5
1 3 6
1 4 5
1 4 6
1 5 6
2 3 4
2 3 5
2 3 6
3 4 5
3 4 6
4 5 6

推算的结果为,假设从1-6取3个数,要求在不考虑顺序的情况下,数字不重复,共有16种。这种题,就常出现在现在的小学数学一、二年级。
如果换成从1-7取4个数,或者从1-8取3个数,对比一下结果,就能推算出一个公式,根据这个公式就能写出0-100取10个数(或任意个数)的所有组合的程序。由于时间的关系,就不推导了。

0-100,随机取10个数的和为100的算法看似很简单,其实有一定的计算量和难度。

2条评论:
1   朱锦明 2019-01-24 13:23
勇哥,翻页了< 下一页(新)>这个后,看到2006年与2019年的文章排序在一起。我截图了一个图片,如图:http://zhujinming.byethost3.com/ts/20190124.png

自由勇 2019-01-24 13:29
谢谢关注,这个问题我知道的,原因写在了这里:http://www.auiou.com/relevant/00000023.jsp

历时13年,现在终于恢复到了当时的连续计数。此篇博客的ID是23,当到达29的时候,就会恢复连续计数。

恢复之后,会有大片的时间断链。比如翻页时,有时会出现前面的文章还是2019年,后面的文章都是2007、2006年。因为设计这个Blog的程序时,翻页是以数字的连续值来获取ID的。由于时间的关系,现在也没有时间去做一个连续时间的ID列表,当新文章多了,这个问题会被慢慢淡化。

发表评论:
名字: (*必填)
博客: (可省)

正文:

  记住信息?

直接发送Trackback到此文章

说明:本评论系统不支持HTML代码。(您的留言需要审核,审核规则请见这里。)

王志勇:1980-09-26 (39周岁)
程序设计,前端设计。

版权声明:本博客所有文章,均符合原创的定义,禁止转载,违者将必究;正确的方法是贴原文的标题和网址即可。

与此相关的链接
自由勇专栏

Blog存档 Archives

2019年02月
2019年01月(30)
2018年12月(30)
2018年11月(30)
2018年10月(30)
2018年09月(17)
2016年-2017年(9)
2014年06月-09月(10)
2013年 +

2012年 +
2011年 +
2010年 +
2009年 +
2008年 +
2007年 +
2006年 +
2005年09月(4)

Copyright © 2006-2019 auiou.com All rights reserved.
此Blog程序由王志勇编写 已经发布在Arsue