在VBA中重复随机变量

soo*_*ise 6 random vba

如何使用randomize和rnd获取随机变量的重复列表?

通过重复列表,我的意思是如果你运行一个循环来获得10个随机数,列表中的每个随机数都是唯一的.此外,如果您再次运行此序列,您将获得与以前相同的10个随机数.

pax*_*blo 14

来自微软自己的口:

要重复随机数序列,请在使用带有数字参数的Randomize之前立即使用否定参数调用Rnd.

详情请见此处.

整个部分:


备注

Rnd函数返回小于1但大于或等于零的值.

number的值决定了Rnd生成随机数的方式:

对于任何给定的初始种子,产生相同数目的序列,因为对每一个连续的呼叫Rnd功能使用以前的数作为该序列中的下一个号码的种子.

在调用之前Rnd,使用Randomize不带参数的语句使用基于系统计时器的种子初始化随机数生成器.

要在给定范围内生成随机整数,请使用以下公式:

Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
Run Code Online (Sandbox Code Playgroud)

这里,upperbound是范围中的最大数字,lowerbound是范围中的最小数字.

注意要重复随机数序列,请在使用Randomize数字参数之前立即使用否定参数调用Rnd.使用具有相同数字值的Randomize不会重复前一个序列.


举例来说,如果将此代码放入Excel中,则每次运行时都会生成不同的数字:

Sub xx()
    ' x = Rnd(-1) '
    Randomize 10
    MsgBox (Rnd)
End Sub
Run Code Online (Sandbox Code Playgroud)

但是,如果取消注释该x = Rnd(-1)行,则会在每次运行时生成相同的数字.

请注意,您必须做件事.调用Rnd带负参数,并调用Randomize具有特定参数.改变这些东西会给你一个不同的种子(因此序列).


编辑:

你的评论:

通过重复序列,我的意思是如果你运行一个循环来获得10个随机数,列表中的每个随机数都是唯一的.此外,如果您再次运行此序列,您将获得与以前相同的10个随机数.我所描述的是否有意义?

您现在需要一条信息.你要求的不是随机数而是随机数.我将把你先前的答案,我就如何做到这一点在这里.您需要做的就是将洗牌算法与上面详述的种子设置相结合,您将拥有可重复的,独特的序列.


这里有一些代码可以显示它的实际效果.这个子程序的每次运行都会返回序列,4 1 5 6 2 3 7 10 9 8所以我认为这就是你所追求的,一个可重复的,"随机的",独特的序列.如果您希望能够生成不同的序列(但仍以可重复的方式),则只需更改给定的值即可Randomize.

Option Explicit
Option Base 1

Sub xx()
    Dim x(10) As Integer
    Dim xc As Integer
    Dim xp As Integer
    Dim i As Integer
    Dim s As String

    For i = 1 To 10
        x(i) = i
    Next
    xc = 10

    i = Rnd(-1)
    Randomize 1

    s = "Values:"
    For i = 1 To 10
        xp = Int(Rnd * xc) + 1
        s = s & " " & CStr(x(xp))
        x(xp) = x(xc)
        xc = xc - 1
    Next i

    MsgBox (s)
End Sub
Run Code Online (Sandbox Code Playgroud)