ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 产生随机数,且和为0

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-12-15 08:51 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
如图。逛贴吧的时候看到一个帖子,想不出怎么做。烦请各位老师指点一下。3q
随机数等于0.png

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-12-15 09:01 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
需要生成几个随机数,然后相加为0

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-12-15 09:02 | 显示全部楼层
沈默00 发表于 2023-12-15 09:01
需要生成几个随机数,然后相加为0

问了。他也没回。假定20个吧

TA的精华主题

TA的得分主题

发表于 2023-12-15 09:34 | 显示全部楼层
Sub GenerateRandomNumbers()
    Dim rng As Range
    Dim numbers(1 To 20) As Double
    Dim i As Integer
   
    Set rng = Sheet1.Range("A1:A20")
   
    ' 生成随机数
    For i = 1 To 20
        numbers(i) = WorksheetFunction.RandBetween(-20, 20)
    Next i
   
    ' 调整随机数使其和为0
    Do Until WorksheetFunction.Sum(numbers) = 0
        For i = 1 To 20
            If WorksheetFunction.Sum(numbers) > 0 And numbers(i) > 0 Then
                numbers(i) = numbers(i) - 1
            ElseIf WorksheetFunction.Sum(numbers) < 0 And numbers(i) < 0 Then
                numbers(i) = numbers(i) + 1
            End If
        Next i
    Loop
   
    ' 将随机数写入单元格
    rng.Value = WorksheetFunction.Transpose(numbers)
   
    ' 格式化单元格
    rng.NumberFormat = "0"
End Sub

TA的精华主题

TA的得分主题

发表于 2023-12-15 09:41 | 显示全部楼层
先生成随机数,计算和,大于0就平摊到所有正随机数中减去,小于0就平摊到所有负随机数中加上

TA的精华主题

TA的得分主题

发表于 2023-12-15 09:46 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2023-12-15 10:02 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
伪随机
  1. =SORTBY(TOCOL(RANDBETWEEN(ROW(1:10)*0,20)*{1,-1}),RANDARRAY(20))
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-12-15 10:40 | 显示全部楼层
本帖最后由 mykitami 于 2023-12-15 10:41 编辑

这种题目非常适合用递归方式来解决

自定义函数
=LAMBDA(x,y,z,q,LET(r,TAKE(RANDARRAY(x,,y,z,1),q),IF(SUM(r)=0,r,mydin(x,y,z,q))))
将上述函数定义名称  mydin
image.png
引用该函数
=mydin(40,-20,20,20)
参数分别表示:总随机数个数、最小值、最大值、要加总的随机数个数
image.png

工作簿1.zip

7.74 KB, 下载次数: 4

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-12-15 10:55 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
发粪涂墙911 发表于 2023-12-15 09:02
问了。他也没回。假定20个吧

假定两个:
A1=RANDBETWEEN(0,20)
B1=-A1

TA的精华主题

TA的得分主题

发表于 2023-12-15 11:33 | 显示全部楼层
  1. =REDUCE("重算",ROW(1:999),LAMBDA(x,y,LET(t,RANDARRAY(20,,-20,20,1),IF(SUM(t)=0,t,x))))
复制代码
image.png 理论上循环次数够,都能得出结果

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-19 20:49 , Processed in 0.051544 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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