1、用EXCEL生成随机数

  • rand() 是 [0,1),随机到的是小数
  • randbetween(a,b) 是 [a,b] ,但是只能是整数

如果想在EXCEL公式用randbetween()随机小数呢?

  • 随机,randbetween() 只能随机整数,如果是要小数,那就先乘100,随机完之后再除100这样处理
  • randbetween(a,b) 是 [a,b]
  • RANDBETWEEN(1000G49,1000H49)/1000

2、用VBA生成随机数

方法说明

在VBA里

  • rnd是[0,1)之间随机左闭右开区间

方法

  • 整数[a,b]随机正确写法为 int(a+(b-a+1)*rnd())
  • 小数的随机[a,b) 随机正确写法为 (a+(b-a)*rnd() ’但是右边还是不是闭区间有瑕疵
  • 这样来说,小数随机,如果要求两边是闭区间,不如用整数随机方法,把小数*1000等变大为整数,最后再除,也是一样得把。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int(1+[0,1)*(6-1+1))

= int(1+[0,1)*6)

=int(1+[0,6))

=int([1,7))

=[1,6]

0.1+[0,1)*(0.6-0.1)

=0.1+ [0,1)*0.5

=0.1+[0,0.5)

=[0.1,0.6)
  • 官方解释:

为了生成某个范围内的随机整数,可使用以下公式:
Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
这里,upperbound 是随机数范围的上限,而 lowerbound 则是随机数范围的下限。
注意 若想得到重复的随机数序列,在使用具有数值参数的 Randomize 之前直接调用具有负参数值的 Rnd。使用具有同样 number 值的 Randomize 是不会得到重复的随机数序列的。

  • rnd 是左闭右开区间 [0,1)
  • 如果要生成 a~b之间的随机数,一般是int(a+ (b-a+1)*rnd)
  • 因为一般都是要在整数之间随机 要用 int()

例子

  • 1、生成1-10的随机数:

    p1 = Int(1 + 10* Rnd()) —这里正确,刚好10=10-1+1
    p1 = Int(1 + (10-1+1) * Rnd()) –总是正确

  • 2、生成 2-9之间的随机数:

    p2 = Int( 2 + 9* Rnd() ) –错误的
    p2 = Int(2 + (9-2+1) * Rnd()) —-正确

其他方法

  • 1、rnd(-1)

    用永远生成相同的随机数
    相当于固定随机数种子了?这样的应用情景是?

  • 2、rnd(0)

    虽然随机序列都一样,但和rnd(-1) 不同
    每次连续随机,也是一样的随机数种子,总是用上次的
    但是如果先停止,再重新开始,就是用下一个随机种子,会和以前的不同

测试随机数的代码

测试方法:

这个进行了多轮随机
p1 = Int(1 + (10) * Rnd()) ‘Rnd()分别修改为 rnd(-1) rnd(0) rnd(1) rnd(999) 看效果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
Private p1
Private s1, s2, s3, s4, s5, s6, s7, s8, s9, s10
Private S

Sub tt1()

Call intial1

S = 10000
For i = 1 To S
Call RR1
Call SS1
' Debug.Print p1
Next

Call SS2
End Sub

Function intial1()
s1 = 0
s2 = 0
s3 = 0
s4 = 0
s5 = 0
s6 = 0
s7 = 0
s8 = 0
s9 = 0
s10 = 0
End Function

Function SS2()
Debug.Print "随到1的平均次数是= " & s1 / S & " s1=" & s1
Debug.Print "随到2的平均次数是= " & s2 / S & " s2=" & s2
Debug.Print "随到3的平均次数是= " & s3 / S & " s3=" & s3
Debug.Print "随到4的平均次数是= " & s4 / S & " s4=" & s4
Debug.Print "随到5的平均次数是= " & s5 / S & " s5=" & s5
Debug.Print "随到6的平均次数是= " & s6 / S & " s6=" & s6
Debug.Print "随到7的平均次数是= " & s7 / S & " s7=" & s7
Debug.Print "随到8的平均次数是= " & s8 / S & " s8=" & s8
Debug.Print "随到9的平均次数是= " & s9 / S & " s9=" & s9
Debug.Print "随到10的平均次数是= " & s10 / S & " s10=" & s10

End Function

Function RR1()

Randomize
p1 = Int(1 + (10) * Rnd()) 'Rnd()分别修改为 rnd(-1) rnd(0) rnd(1) rnd(999) 看效果
'Debug.Print p1
End Function

Function SS1()

Select Case p1
Case Is = 1
s1 = s1 + 1
Case Is = 2
s2 = s2 + 1
Case Is = 3
s3 = s3 + 1
Case Is = 4
s4 = s4 + 1
Case Is = 5
s5 = s5 + 1
Case Is = 6
s6 = s6 + 1
Case Is = 7
s7 = s7 + 1
Case Is = 8
s8 = s8 + 1
Case Is = 9
s9 = s9 + 1
Case Is = 10
s10 = s10 + 1
End Select

End Function

相关链接

  1. VBA的随机数生成:整数范围内随机(更好些),小数范围内随机

=================我是分割线=================

欢迎到公众号来唠嗑: