ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 846|回复: 8

[求助] 万望大神相助(随机数问题)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-5-17 12:03 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
image.png
如图,要在B列产生随机数,要求随机数合计正好是2000,或者其他指定的数值,可以保留小数点后1位或者不保留都行。
Excel 2019
万望大神相助,小弟涕零遥拜!

TA的精华主题

TA的得分主题

发表于 2020-5-17 14:42 | 显示全部楼层
B2 公式: =IF(ROW()=COUNTA(A:A),F$1-SUM(B$1:B1),RANDBETWEEN(MAX(B$1:B1),INT((F$1-SUM(B$1:B1))/(COUNTA(A:A)-ROW()+1))))
log.gif

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-5-17 15:14 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
cutecpu 发表于 2020-5-17 14:42
B2 公式: =IF(ROW()=COUNTA(A:A),F$1-SUM(B$1:B1),RANDBETWEEN(MAX(B$1:B1),INT((F$1-SUM(B$1:B1))/(COUNTA ...

首先感谢大神百忙之中回复,如果能让随机出现的结果不是那么的接近就更加完美了,拜谢了!

TA的精华主题

TA的得分主题

发表于 2020-5-17 15:50 | 显示全部楼层
香川老师的代码可以参考下  
f(2000, 10, 500, 15, -1)
  1. Sub test() '测试代码 在立即窗口中打印结果
  2.     For i = 1 To 20
  3.         Debug.Print f(2000, 10, 500, 15, -1)
  4.     Next
  5. End Sub

  6. '下面是自定义函数过程,可以直接在Excel工作表中引用
  7. Function f(h, h1, h2, n, d, Optional k = 100)
  8.     Application.Volatile '设置为易失性函数,可以按F9自动重算

  9.     h = h * 10 ^ d: h1 = h1 * 10 ^ d: h2 = h2 * 10 ^ d '按设定小数位转为整数处理
  10.     v& = Int(h / n): If v < h1 Or v > h2 Then f = "Average Err !": Exit Function
  11.     '如果计算平均值不在设置范围内则报错停止
  12.    
  13.     ReDim a&(n - 1)
  14.     For i = 1 To n - 1
  15.         a(i) = v
  16.     Next
  17.     a(0) = h - v * (n - 1)
  18.     '以上为数组a按平均值初始化

  19.     '以下为随机t交换计算调整
  20.     Randomize
  21.     For i = 1 To k '重复k次 k可自行设置
  22.         r1 = Int(Rnd * n) '随机定第1个数位置r1
  23.         r2 = Int(Rnd * n) '随机定第2个数位置r2
  24.         If Rnd < 0.5 Then  '随机选择r1减去t、r2加上t
  25.             p = h2 - a(r2): q = a(r1) - h1: If p < q Then t = p Else t = q '求t最大可能值
  26.             t = Int(Rnd * t) '在t可能区间内随机取值
  27.             a(r1) = a(r1) - t: a(r2) = a(r2) + t 'r1减去t、r2加上t
  28.         Else '或随机选择r1加上t、r2减去t
  29.             p = h2 - a(r1): q = a(r2) - h1: If p < q Then t = p Else t = q '求t最大可能值
  30.             t = Int(Rnd * t) '在t可能区间内随机取值
  31.             a(r1) = a(r1) + t: a(r2) = a(r2) - t 'r1加上t、r2减去t
  32.         End If
  33.     Next
  34.    
  35.     '随机k次(默认k=100)次随机t交换计算后 输出结果
  36.     For i = 0 To n - 1
  37.         s = s & "+" & a(i) * 10 ^ -d
  38.     Next
  39.     f = h * 10 ^ -d & "=" & Mid(s, 2)
  40. End Function
复制代码

http://club.excelhome.net/forum. ... 252&pid=8239845

TA的精华主题

TA的得分主题

发表于 2020-5-17 16:13 | 显示全部楼层
图上看,有15个数,先随机生成14个数,第15个数等于2000-前14个数之和

TA的精华主题

TA的得分主题

发表于 2020-5-17 16:47 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-5-17 17:15 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-1-2 19:01 | 显示全部楼层
选中B2:B16单元格,输入:
  1. =MOD(SMALL(RANDBETWEEN(ROW(1:5)^0*{1,1,1},999)*1000+ABS(IF({1,1,0},201*{1,0}-RANDBETWEEN(ROW(1:5)^0,200),{0;0;0;0;995}-MMULT({1,0,0,0;0,1,0,0;0,0,1,0;0,0,0,1;1,1,1,1},RANDBETWEEN({1;1;1;1}*199,200)))),ROW(1:15)),500)
复制代码


按ctrl+shift+enter即可数值在1到200之间。如果你需要的是其它范围的数值,再告诉我即可

TA的精华主题

TA的得分主题

发表于 2024-1-2 19:42 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-19 15:39 , Processed in 0.039679 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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