我有5个可以按任何唯一顺序放置的项目,我想将一个唯一顺序的值(数字)一一存储到一个变量中。例如:
用户输入:7
然后i_Int = 7
应该给我
v_Var = 1
等待1秒
v_Var = 3
等待1秒
v_Var = 2
等待1秒
v_Var = 4
等待1秒
v_Var = 5
下面的数据列出了5个项目的所有可能排列,第一行列出了排列#,我将没有此数据来使事情变得简单。
1 1 2 3 4 5
2 1 2 3 5 4
3 1 2 4 3 5
4 1 2 4 5 3
5 1 2 5 3 4
6 1 2 5 4 3
7 1 3 2 4 5
8 1 3 2 5 4
9 1 3 4 2 5
10 1 3 4 5 2
...
111 5 3 2 1 4
112 5 3 2 4 1
113 5 3 4 1 2
114 5 3 4 2 1
115 5 4 1 2 3
116 5 4 1 3 2
117 5 4 2 1 3
118 5 4 2 3 1
119 5 4 3 1 2
120 5 4 3 2 1
答案 0 :(得分:0)
这是一个返回排名1,...,n
的{{1}}的排列的函数:
i
默认情况下,它以基于1的数组形式返回结果。要使其从0开始,请使用类似Function Unrank(ByVal n As Long, ByVal rank As Long, Optional lb As Long = 1) As Variant
Dim Permutation As Variant
Dim Items As Variant
ReDim Permutation(lb To lb + n - 1)
ReDim Items(0 To n - 1)
Dim i As Long, j As Long, k As Long, q As Long
Dim fact As Long
For i = 0 To n - 1
Items(i) = i + 1
Next i
rank = rank - 1
j = lb
For i = n - 1 To 1 Step -1
fact = Application.WorksheetFunction.fact(i)
q = Int(rank / fact)
Permutation(j) = Items(q)
'slide items above q 1 unit to left
For k = q + 1 To i
Items(k - 1) = Items(k)
Next k
j = j + 1
rank = rank Mod fact
Next i
'place last item:
Permutation(lb + n - 1) = Items(0)
Unrank = Permutation
End Function
的调用。作为测试:
Unrank(5,7,0)
Sub test()
'fills A1:A120 with the permutations of 1,2,3,4,5
Dim i As Long
For i = 1 To 120
Cells(i, 1).Value = Join(Unrank(5, i), " ")
Next i
End Sub
太大,无法保存在13!
变量中,因此代码在Long
时引发未捕获的错误。我使用的算法取决于对相关阶乘进行模块化算术的能力,因此在VBA中没有轻松解决的方法。请注意,您可以轻松地调整代码,以便向其传递要置换的项目数组,而不必总是置换1-n。该算法破坏了数组n=14
,因此这种调整将涉及为传递的数组创建一个基于0的副本(以便进行模块化算术运算)。