ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 香川群子

[原创] 凑数强化版【庆贺2021年5月9日母亲节】

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2021-5-9 12:25 | 显示全部楼层
香川群子 发表于 2021-5-9 11:03
我发现是这样子的。

十进制数的数值范围就是含小数位的,是不受浮点运算影响的变量类型。

谢谢分享,这个凑数太难了。
比如十大经典排序法,冒泡法还好理解,其他的如堆、桶、希尔....等就不好说了,又比如5g通信,凡涉及算法的,至少需要脑子空灵一点的人才行,一般人看了代码也不懂。
您的工具收下了,代码就不看了

TA的精华主题

TA的得分主题

发表于 2021-5-10 11:52 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2021-5-10 16:41 | 显示全部楼层
致敬大佬作者,前段时间用您之前的代码,帮忙解决了财务同事的问题

TA的精华主题

TA的得分主题

发表于 2021-5-11 06:24 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2021-5-11 17:23 | 显示全部楼层
香川群子 发表于 2021-5-8 18:24
希望使用者好好看一下代码变量的简单注释,这样才能搞清楚程序参数的各种具体应用方法。

香川群子大师您好,有空请指导一下,谢谢您!http://club.excelhome.net/thread-1584622-1-1.html

TA的精华主题

TA的得分主题

发表于 2021-5-12 10:41 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
下载来好好学习

TA的精华主题

TA的得分主题

发表于 2021-5-12 11:23 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2021-5-13 09:52 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
不知道怎么联系香川老师,有个帖子麻烦你看一下行吗。

http://club.excelhome.net/thread-1584045-1-1.html

TA的精华主题

TA的得分主题

发表于 2021-5-19 17:33 | 显示全部楼层
'第1参数 h: 指定目标总和?或 目标平均值?
'如需固定结果,则应复制后粘贴为数值。
'第2参数 h1 :返回结果的下限。直接指定,或平均值的0.x倍、1-x%倍等。
'第3参数 h2 :返回结果的上限。直接指定,或平均值的x倍、1+x%倍等。
'第4参数 n: 返回结果的个数?理论上整数范围即可无限制?实际数量几万以上可否没试过?
'第5参数 d :返回结果的小数位数。用法同Round(Num,d)即=0为整数、>0为小数位数、<0为向上取整。
'可选参数:
'第6参数 k :返回结果的模式。默认k=0 可选值4个: -1、0、1、2
'k=-1 时、返回不允许重复值的合并字符串结果。即只在1个单元格中返回结果。
'k= 0 时、返回  允许重复值的合并字符串结果。即只在1个单元格中返回结果。
'k= 1 时、返回不允许重复值的区域数组。即需要选中横向n列后输入三键数组公式。(Ctrl+Shift+Return)
'k= 2 时、返回  允许重复值的区域数组。即需要选中横向n列后输入三键数组公式。(Ctrl+Shift+Return)
'第7参数 l :返回结果是否包含h1、h2边界的模式。默认l=1 可选值2个: 0、1
'l =1 时、返回结果  包含边界。即结果范围是[h1,h2]的开区间。>=h1 并 <=h2
'l =0 时、返回结果不包含边界。即结果范围是(h1,h2)的开区间。> h1 并 < h2
'第8参数 m :随机试算的次数。默认m=30 可选范围为:>0的正整数。
'如认为计算结果不够随机,可增大m值如 m=100、m=3000……但m值越大,计算耗时越多。m太大可能会死机。
'如认为计算结果已够随机,而需要提高运算速度,可减小m值如 m=10。
Function GetRndSum(h#, h1#, h2#, n&, d%, Optional k% = 0, Optional l% = 1, Optional m% = 30)
    Application.Volatile
    Dim i&, r1&, r2&, t&, v&, cnt&
   
    If h < h2 Then h = h * n
    h = h * 10 ^ d: h1 = h1 * 10 ^ d: h2 = h2 * 10 ^ d
    v = Int(h / n): If v < h1 Or v > h2 Then GetRndSum = "Average Err !": Exit Function

Retry:
    cnt = cnt + 1
    ReDim a&(n - 1)
    For i = 1 To n - 1
        a(i) = v
    Next
    a(0) = h - v * (n - 1)
   
    Randomize
    For i = 1 To n * m
        r1 = Int(Rnd * n): r2 = Int(Rnd * (n - 1) + r1 + 1) Mod n
        If h1 + h2 < a(r1) + a(r2) Then t = h2 - a(r2) Else t = a(r1) - h1
        t = Int(Rnd * (t + l)): a(r1) = a(r1) - t: a(r2) = a(r2) + t
        'l=1 [h1,h2] / l=0 (h1,h2)
    Next
   
    If k Mod 2 Then '-1,1 Check Unique
        If cnt > m Then GetRndSum = "Duplicate": Exit Function
        ReDim c&(h1 To h2)
        For i = 0 To n - 1
            If c(a(i)) = 0 Then c(a(i)) = 1 Else GoTo Retry
        Next
    End If
   
    ReDim b(n - 1) '-1/1: Unique only 0/2: duplicate OK
    For i = 0 To n - 1
        b(i) = a(i) * 10 ^ -d
    Next
    If k > 0 Then GetRndSum = b Else GetRndSum = h * 10 ^ -d & "=" & Join(b, "+")
End Function
老师那您这个随机拆分的 可以改造成十进制的不?有时候有7,8位小数的时候会溢出!!

TA的精华主题

TA的得分主题

发表于 2021-5-19 18:41 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
向楼主致敬!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-28 19:27 , Processed in 0.045917 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表