vba rnd()函数真的是随机的么?

vba rnd()函数真的是随机的么?,第1张

vba中RND() 函数是生成0~1的随机数字。
语法
Rnd[(number)]
可选的 number 参数是 Single 或任何有效的数值表达式。
返回值
如果 number 的值是 Rnd 生成
小于 0 每次都使用 number 作为随机数种子得到的相同结果。
大于 0 序列中的下一个随机数。
等于 0 最近生成的数。
省略 序列中的下一个随机数。
说明
Rnd 函数返回小于 1 但大于或等于 0 的值。
number 的值决定了 Rnd 生成随机数的方式。
对最初给定的种子都会生成相同的数列,因为每一次调用 Rnd 函数都用数列中的前一个数作为下一个数的种子。
在调用 Rnd 之前,先使用无参数的 Randomize 语句初始化随机数生成器,该生成器具有根据系统计时器得到的种子。
为了生成某个范围内的随机整数,可使用以下公式:
Int((upperbound - lowerbound + 1) Rnd + lowerbound)
这里,upperbound 是随机数范围的上限,而 lowerbound 则是随机数范围的下限。
注意 若想得到重复的随机数序列,在使用具有数值参数的 Randomize 之前直接调用具有负参数值的 Rnd。使用具有同样 number 值的 Randomize 是不会得到重复的随机数序列的。
---------------------------------
Rnd 函数示例
本示例使用 Rnd 函数随机生成一个 1 到 6 的随机整数。
Dim MyValue
MyValue = Int((6 Rnd) + 1) ' 生成 1 到 6 之间的随机数值。

这个问题的重点,是前一个,随机4个单元格,那么单元格不能重复,用字典方法最稳妥。随机生成大于等于1,小于等于10的数字循环4次即可。
上述循环中,加上随机0-100的整数,即然没说不能重复,那就简单了。

要求中有两个问题,
1个函数产生一个结果,第2次用函数产生另一结果,但不能保证多组结果的合格率不相同。除非一次性返回多个组结果。

1个函数返回的结果一定是在你输入的单元格或者连续区域,不能由你选择。
例如你在A1输入函数,要在C3返回结果,那是不可能的。

给你两段代码 我更倾向于用第一段代码因为可能会少循环几次就可以得到结果

Sub aa()
Dim Z, He, M, N, X, Y As Long
Dim YsArr() As Double
N = 10   '要生成的数字个数
X = 3    '生成数的最小值
Y = 20   '生成数的最大值
Z = 100  '生成数的和
Do
    For i = 1 To N - 1
        ReDim Preserve YsArr(1 To i)
        YsArr(i) = Int(Rnd  (Y - X)) + X
    Next
    He = WorksheetFunctionSum(YsArr)
    If Z - He >= X And Z - He <= Y Then
        M = UBound(YsArr) + 1
        ReDim Preserve YsArr(1 To M)
        YsArr(M) = Z - He
    Else
        Erase YsArr
    End If
Loop Until M = N
Range("A1")Resize(M, 1) = WorksheetFunctionTranspose(YsArr)
End Sub
Sub bb()
Dim Z, He, M, N, X, Y As Long
Dim YsArr() As Double
N = 10   '要生成的数字个数
X = 3    '生成数的最小值
Y = 20   '生成数的最大值
Z = 100  '生成数的和
If Z = "False" Then Exit Sub
Do
    For i = 1 To N
        ReDim Preserve YsArr(1 To i)
        YsArr(i) = Int(Rnd  (Y - X)) + X
    Next
Loop Until WorksheetFunctionSum(YsArr) = Z
Range("A1")Resize(N, 1) = WorksheetFunctionTranspose(YsArr)
End Sub

Sub 组合6in10() '1,3,7,12,13,15,19,20,23,24
Dim Arr(10)
Dim I1, I2, I3, I4, I5, I6, M
Arr(1) = 1: Arr(2) = 3: Arr(3) = 7: Arr(4) = 12: Arr(5) = 13: Arr(6) = 15: Arr(7) = 19: Arr(8) = 20: Arr(9) = 23: Arr(10) = 24
M = 0

For I1 = 1 To 5
For I2 = I1 + 1 To 6
For I3 = I2 + 1 To 7
For I4 = I3 + 1 To 8
For I5 = I4 + 1 To 9
For I6 = I5 + 1 To 10
M = M + 1
Range("A" & M) = Arr(I1): Range("B" & M) = Arr(I2): Range("C" & M) = Arr(I3): Range("D" & M) = Arr(I4): Range("E" & M) = Arr(I5): Range("F" & M) = Arr(I6)
Next
Next
Next
Next
Next
Next
End Sub

1 可以通过使用VBA编程实现将单元格内的数值随机手写字体
2 原因是VBA能够获取单元格中的文本内容,并且设置字体、颜色等属性。
通过使用随机数函数,可以实现每次生成不同的手写字体。
3 具体实现方法为:首先,通过VBA代码获取单元格中的文本内容;然后,使用随机数函数生成不同的参数(如字体、颜色等),并将其应用于文本内容;最后,将生成的手写文本替换原有的文本,并将其显示在单元格中即可。

根据本人的理解,vba中rnd,rnd()都可以用,有括号可以加一个数值参数。
当不用参数时,两者一样。
加参数,则改变默认的“种子数”了。
默认的种子数是什么,根据什么公式算出的随机数,在哪儿看过,对我不重要的。
希望能帮到您。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13391948.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-27
下一篇 2023-07-27

发表评论

登录后才能评论

评论列表(0条)

保存