ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 多个整数随机排列问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-9-12 14:35 | 显示全部楼层
ynzsvt 发表于 2024-9-12 14:33
24阶乘分之一的概率会死机吧。

是的,有末位陷阱,没做防错处理

TA的精华主题

TA的得分主题

发表于 2024-9-12 15:42 | 显示全部楼层

当位置1~23刚好排完数字1~23时,剩下数字24排在位置24,此时便会进入死循环。

TA的精华主题

TA的得分主题

发表于 2024-9-12 15:43 | 显示全部楼层
chenjx80 发表于 2024-9-12 15:42
当位置1~23刚好排完数字1~23时,剩下数字24排在位置24,此时便会进入死循环。

嗯,我上面说了。解决也简单的,懒得写

TA的精华主题

TA的得分主题

发表于 2024-9-12 15:47 | 显示全部楼层
就再写一个吧,末位死循环时懒得做调整处理,直接从头再来。
  1. Sub test()
  2. Dim i&, n&, arr(1 To 24, 0)
  3. For i = 1 To 24
  4.   If i = 24 And arr(24, 0) = "" Then Exit For
  5.   n = Int(Rnd() * 24) + 1
  6.   If arr(n, 0) = "" And n <> i Then arr(n, 0) = i Else i = i - 1
  7. Next i
  8. If i = 24 Then test
  9. [a1:a24] = arr
  10. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2024-9-12 15:48 | 显示全部楼层
供参考:
  1. Public Sub RandArray()
  2.    Const MAXNUMBER As Long = 24
  3.    Dim arr(1 To MAXNUMBER) As Long
  4.    Dim pos As Long, randPos As Long, tmp As Long
  5.    
  6.    For pos = 1 To MAXNUMBER: arr(pos) = pos: Next
  7.    Randomize
  8.    pos = 1
  9.    Do
  10.       randPos = Int(Rnd() * MAXNUMBER) + 1
  11.       If pos <> arr(randPos) And randPos <> arr(pos) Then
  12.          tmp = arr(pos)
  13.          arr(pos) = arr(randPos)
  14.          arr(randPos) = tmp
  15.          
  16.          pos = pos + 1
  17.          If pos > MAXNUMBER Then Exit Do
  18.       End If
  19.    Loop
  20.    
  21.    Range("A1:A24").Value = WorksheetFunction.Transpose(arr)
  22. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2024-9-12 16:15 | 显示全部楼层
  1. Sub test()
  2. Dim arr(1 To 24), brr
  3. Set d = CreateObject("scripting.dictionary")
  4. For i = 1 To 24
  5.     d(i) = i
  6. Next i
  7. For j = 1 To 24
  8. brr = d.keys
  9. 100:
  10.     h = WorksheetFunction.RandBetween(1, UBound(brr) + 1)
  11.     If d(brr(h - 1)) = j Then GoTo 100
  12.     arr(j) = brr(h - 1)
  13.     d.Remove (brr(h - 1))
  14. Next j
  15. Range("a1").Resize(UBound(arr), 1) = WorksheetFunction.Transpose(arr)
  16. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2024-9-12 19:10 | 显示全部楼层
Option Explicit
Sub test1()
    Dim ar, i&, n&, xNum&, vTemp
    ReDim ar(1 To 24, 0)
   
    For i = 1 To UBound(ar)
        ar(i, 0) = i
    Next i
    n = UBound(ar)
    For i = 1 To UBound(ar) - 1
        Do Until ar(i, 0) <> i
            xNum = Int((n - i + 1) * Rnd() + i)
            vTemp = ar(xNum, 0): ar(xNum, 0) = ar(i, 0): ar(i, 0) = vTemp
        Loop
    Next
   
    [A1].Resize(UBound(ar)) = ar
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-9-12 21:55 | 显示全部楼层
WPS中的JSA练习一下——


微信截图_20240912215344.png


240912_随机数不出现在原来的位置上.rar

11.55 KB, 下载次数: 3

用WPS打开并启用宏

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-9-13 11:32 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

感谢,这个可以用的

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-9-13 11:33 | 显示全部楼层
kevinchengcw 发表于 2024-9-12 09:19
不重复的12组随机2个位置互换即可

很好的思路,感谢回复
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-18 23:31 , Processed in 0.042762 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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