• 'Dim min As Integer '定义随机数的最小值 'Dim max As Integer '定义随机数的最大值 '限制只产生500个，VBA的速度问题 Public Function CreateRND(ByVal min As Integer, _
<span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name="code" class="vb">'Dim min As Integer                             '定义随机数的最小值
'Dim max As Integer                             '定义随机数的最大值
'限制只产生500个，VBA的速度问题
Public Function CreateRND(ByVal min As Integer, _
ByVal max As Integer) As Integer()

Dim a_size As Integer

a_size = max - min

If a_size > 500 Or max - min + 1 < a_size Then: Exit Function             '限制只产生500个，VBA的速度问题
'如果最大值和最小值的差小于数组大小数值就什么也不做

Dim arr() As Integer                            '定义数组
ReDim arr(a_size)                               '更改数组大小
Dim flag As Boolean                             '定义标志变量，用来判断是否有重复值

Randomize (Now())                               '用当前时间生成随机数种子

For i = 0 To a_size                             '循环生成随机数

Do
arr(i) = Rnd() * (max - min) + min      '生成随机数

flag = False

For j = 0 To (i - 1)                    '循环判断当前的随机数是否和前面生成的随机数相同，如果相同就重新生成

If (arr(i) = arr(j)) Then
flag = True
End If

Next

Loop While flag

'循环中不断生成随机数，直到不重复为止

Next

CreateRND = arr

End Function


调用方法：

    Dim arr() As Integer
arr = CreateRND(10034, 0, 10034)



展开全文
• Sub 随机挑选演示程序1() Dim arr Dim x As Integer, num As Integer, k As Integer Range("c1:c10") = "" Range("a1:a10") = Application.Transpose(Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J"))...
Sub 随机挑选演示程序1()
Dim arr
Dim x As Integer, num As Integer, k As Integer
Range("c1:c10") = ""
Range("a1:a10") = Application.Transpose(Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J"))

For x = 1 To 10
num = (Rnd() * (10 - 1) + 1) \ 1
Range("a1:a10").Interior.ColorIndex = xlNone
Range("a" & num).Interior.ColorIndex = 6
Range("c" & x) = Range("a" & num)
Next x

End Sub


Sub 移形换位演示程序()
Dim arr
Dim x As Integer, num As Integer, k As Integer, sr As String
Range("c1:c10") = ""
Range("a1:a10") = Application.Transpose(Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J"))

For x = 1 To 10
num = (Rnd() * ((10 - x + 1) - 1) + 1) \ 1
Range("a1:a" & (10 - x + 1)).Interior.ColorIndex = xlNone
Range("a" & num).Interior.ColorIndex = 6
Range("c" & x) = Range("a" & num)
'下面开始换位
sr = Range("a" & num)
Range("a" & num) = Range("a" & (10 - x + 1))
Range("a" & (10 - x + 1)) = sr
Range("a" & (10 - x + 1)).Interior.ColorIndex = 1
Next x

End Sub


Sub 随机抽取字典法()
Dim d As Object
Dim arr, num As Integer, x As Integer, arr1(1 To 20000, 1 To 1) As String, t
t = Timer
Set d = CreateObject("scripting.dictionary")
arr = Range("a1:a20000")

For x = 1 To 20000
100:
num = Rnd() * (20000 - 1) + 1
If d.exists(num) Then
GoTo 100
Else
d(num) = ""
arr1(x, 1) = arr(num, 1)
End If
Next x

Range("c1:c20000") = ""
Range("c1:c20000") = arr1
[d65536].End(xlUp).Offset(1, 0) = Timer - t
End Sub

'提速依据 '在换位时数字的换位速度要比文本型要快。所以借力数值型数组达到提速的目的
Sub 移形随机排序()
Dim arr
Dim arr1(1 To 20000, 1 To 1) As String, sr As String
Dim x As Integer, num, t
t = Timer
arr = Range("a1:a20000")
For x = 1 To UBound(arr)
num = (Rnd() * ((20000 - x + 1) - 1) + 1) \ 1
arr1(x, 1) = arr(num, 1)
'换位
sr = arr(num, 1)
arr(num, 1) = arr(20000 - x + 1, 1)
arr(20000 - x + 1, 1) = sr
Next x
Range("c1:c20000") = ""
Range("c1:c20000") = arr1
[d65536].End(xlUp).Offset(1, 0) = Timer - t
End Sub


Sub 移形随机排序升级()
Dim arr
Dim arr1(1 To 20000, 1 To 1) As String, sr As Integer
Dim x As Integer, num, t, y
Dim arr2(1 To 20000)
t = Timer
arr = Range("a1:a20000")

For y = 1 To 20000
arr2(y) = y
Next y

For x = 1 To UBound(arr)
num = (Rnd() * ((20000 - x + 1) - 1) + 1) \ 1
arr1(x, 1) = arr(arr2(num), 1)
'换位
sr = arr2(num)
arr2(num) = arr2(20000 - x + 1)
arr2(20000 - x + 1) = num
Next x

Range("c1:c20000") = ""
Range("c1:c20000") = arr1
[F65536].End(xlUp).Offset(1, 0) = Timer - t

End Sub

展开全文
• 用EXCEL生成随机数 用VNA生成随机数 生成1-10的随机数 p1 = Int(1 + 10* Rnd()) ---这里正确，刚好10=10-1+1 p1 = Int(1 + (10-1+1) * Rnd()) --总是正确 如果生成 2-9之间的随机数 p2 = Int( 2 + 9*...

1用EXCEL生成随机数
rand()  也是 [0,1）randbetween(a,b)   是  [a,b]

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

2用VBA生成随机数
官方解释

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

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

2.1 例子
生成1-10的随机数
p1 = Int(1 + 10* Rnd())              ---这里正确，刚好10=10-1+1p1 = Int(1 + (10-1+1) * Rnd())     --总是正确

如果生成 2-9之间的随机数
p2 = Int( 2 + 9* Rnd() )              --错误的p2 = Int(2 + (9-2+1) * Rnd())     ----正确

2.2 还玩了下其他的

rnd(-1)
用永远生成相同的随机数相当于固定随机数种子了？这样的应用情景是？

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

3 下面是测试随机数的代码
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())
'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



展开全文
• 在游戏设计的过程中，经常会碰到需要设计很多不同的概率分布来达到一个系统的设计目的，让玩家在体验这个系统的时候感受更好，所以这时候均匀分布随机就不够用了，就需要开始为游戏设计不同的概率分布随机数。...

引子 一把武器的品质有分为最下级、下级、中级、上级、最上级五档，我希望在击杀一只怪物的时候，这把武器的掉率：最下级>下级>中级>上级>最上级，问如何设计满足上面的需求？ 在游戏设计的过程中，经常会碰到需要设计很多不同的概率分布来达到一个系统的设计目的，让玩家在体验这个系统的时候感受更好，所以这时候均匀分布随机就不够用了，就需要开始为游戏设计不同的概率分布随机数。这里，介绍两种方法用来生成任意概率分布的随机数：逆变换方法、舍取方法。这两种算法其原理已被证实，所以这里不再进行论证，如果需要去探究其原理，可以去中国知网上搜索相关论文进行查看。逆变换方法（Inverse Transform Method,ITM） 最简单的生成算法是Inverse Transform Method（下文简称ITM）。如果我们可以给出概率分布的累积分布函数（下文简称CDF）及其逆函数的解析表达式，则可以非常简单便捷的生成指定分布随机数。
ITM算法思路

根据给出的概率密度函数f(X)（PDF）积分得到其累积分布函数F(X)（CDF）生成一个服从均匀分布的随机数S~U(0,1)根据累积分布函数Y=F(X)，求得其反函数X=F-1(Y)返回X=F-1(S)作为本次生成的随机数

这种算法在实现时必须保证给出的概率密度函数，能够求出其累积分布函数CDF的逆函数，否则将无法求得所需要的随机数。下面就以指数分布为例，实现生成符合指数分布的随机数。
ITM方法的VBA实现
这里，先给出指数分布的PDF和CDF，λ是分布的一个参数，常被称为率参数（rate parameter）且λ>0。 概率密度函数

累积分布函数

1 Option Explicit
2 Option Base 1
3
4 Sub expDistribution()
5 Range("J:J").ClearContents
6 Range("J1") = "指数分布随机数"
7
8 Dim src As Single 'src：用来生成均匀分布随机数U(0,1)
9 Dim λ As Single 'λ：指数分布的参数
10 Dim num As Integer 'num：生成的随机数个数
11 Dim arr() As Integer 'arr()：用来保存生成的随机数结果
12
13 λ = Range("C10").value
14 num = Range("C11").value
15
16 ReDim arr(1 To num) As Integer
17 Dim i As Integer
18 For i = 1 To num Step 1
19 src = Rnd()
20 arr(i) = WorksheetFunction.RoundDown(-1 / λ * Log(src), 0)
21 Next
22
23 For i = 1 To num Step 1
24 Range("J" & i + 1) = arr(i)
25 Next
26 End Sub

View Code

ITM实现结果
上述代码中可以看到，我将自己设定的30000个随机数（参数λ=0.3）都打印在表中J列单元格，这里给出最后的统计数据，如下。

可以看到，最终生成的30000个随机数，其数值的个数分布是符合之前给定的指数分布的。这种算法较为简洁高效，在能够使用的情况下，可以考虑优先使用该算法。舍取方法（Acceptance-Rejection Method,ARM） 当无法给出CDF逆函数的解析表达式时，Acceptance-Rejection Method（下文简称ARM）是另外的选择。ARM的适用范围比ITM要大，只要给出概率密度函数（下文简称PDF）的解析表达式即可，而大多数常用分布的PDF是可以查到的。
ARM算法思路

设定我们需要实现的概率密度分布函数PDF为f(x)，确定f(x)的定义域[xmin,xmax]、值域[ymin,ymax]生成一个均匀分布随机数X~U(xmin,xmax)生成一个均匀分布随机数Y~U(ymin,ymax)如果Y≤f(X)，则返回X作为本次的随机数；否则回到第2步
下面，依旧以指数分布为例，利用ARM实现该分布的随机数生成。
ARM方法的VBA实现

1 Option Explicit
2 Option Base 1
3
4
5
6 Sub ARMexpDistribution()
7 Range("J:J").ClearContents
8 Range("J1") = "指数分布随机数"
9
10 Dim src As Single 'src：用来生成第一个均匀分布随机数src~U(0,1 / λ * Log(λ / 0.0001))
11 Dim dst As Single 'dst：用来生成第二个均匀分布随机数dst~U(0,λ)
12 Dim λ As Single 'λ：指数分布的参数
13 Dim num As Integer 'num：生成的随机数个数
14 Dim arr() As Integer 'arr()：用来保存生成的随机数结果
15
16 λ = Range("C11").value
17 num = Range("C12").value
18
19 ReDim arr(1 To num) As Integer
20 Dim i As Integer
21 For i = 1 To num Step 1
22 Do
23 src = Rnd() * 1 / λ * Log(λ / 0.0001)
24 dst = Rnd() * λ
25 Loop While dst > λ * Exp(-λ * src)
26 arr(i) = WorksheetFunction.RoundDown(src, 0)
27 Next
28
29 For i = 1 To num Step 1
30 Range("J" & i + 1) = arr(i)
31 Next
32 End Sub

View Code

ARM实现结果
同样是生成30000个随机数，同样是参数λ=0.3，可以看到下面的列表中的统计数据以及统计图和第一种方法的实现结果是想吻合的，验证了这个方法的可行性。ARM本质上是一种模拟方法，而非直接数学方法。它每次生成新的随机数后，通过另一个随机数来保证其被接受概率服从指定的PDF。显然ARM从效率上不如ITM，但是其适应性更广，在无法得到CDF的逆函数时，ARM是不错的选择。

如果一种概率分布是由很多常见的概率分布组合而成，那么可以先生成常见概率分布的随机数，然后进行组合得到最终的概率分布随机数。

转载于:https://www.cnblogs.com/architecture101-gbt/p/8303378.html
展开全文
• VBA生成和为定值的随机数 最近完成了一个VBA小程序，生成和为定值的一系列随机数 在A1:D4区域生成随机数，每行的和等于E列的值 首先我们需要引入第一个函数，计算A1:D4的和 Application.Sum(Range(“A1:D1”)) ...
• EXCEL随机数据 使用 单元格表达式 以及 Excel VBA 快速生成随机数据。使用单元格表达式（函数）在指定范围产生随机整数、小数、大小写英文字符、字符串、随机日期和随机时间，并设定输出的时间格式和日期格式。产生...
• '可以看到@1和@2代码效果完全一样 　效果图：                 以下来自：http://blog.csdn.net/iamlaosong/article/details/38434179   语法：Rnd[(number)] 　如果 number 的...
• 乍一看，这个题目是有些矛盾的，既然是随机数 ，怎么又是固定的呢？ 实际上，是很多使用Excel 的朋友有这样的需求，希望能产生一些随机数，大家知道可以用Rand函数来产生它，但是这个函数是易失...见附件 核心代码如...
• 今天，试着用VBA来实现以下冒泡排序。程序特点：1. 随机生成数字和日期2. 实现对日期的排序3. 添加了程序参数，方便控制排序类型（可以关闭不需要的排序操作）4. 体验了Option Explicit （强制显式声明变量）功能...
• ", vbCritical, "输入错误") personNumber = "" Exit Sub End If For i = 3 To personNumber + 2 Randomize '要用RND函数产生不同随机数，必须配合随机种子Randomize一起使用 x = Int(Rnd * personNumber) + 1 '...
• VBA里 变量 a 字符串 “a” 函数 func() 数组 array() 数组和函数形式很像，所以需要实现定义清楚，否则不好区分 但是VB里，index用 () 而不是一般语言的 []   Sub t3() Dim arr3(3)...
• Sub suijishu() '随机数 Dim shuzu(1 To 50000, 1 To 20) As Variant '定义数组，注意是从1开始的 Dim hang As Long Dim lie As Long Randomize For hang = 1 To 50000 For lie = 1 To 20 shuzu(hang, ...
• 目录 目标/最终效果 关于VBA VBA简单示例 检查环境 步骤 VBA实现随机抽题 todo challenge 目标/最终效果 目标是制作一个ppt，实现随机抽题，具体描述： 第一页幻灯...
• Excel vba 快捷运行F5 逐条运行F8 MsgBox 弹框 Debug.Print 在立即窗口打印 Sub 随机1() '定义i取1到20 For i = 1 To 20 ' 随机取1到200数 Range("a" & i) = Application.RandBetween(1, 200) ' 随机取颜色1到...
• vba点击开始按钮 在控件中变化显示数字 点击停止不再变化 ，并显示获得的数字
• 在多个指定区间内生成随机数，且随机数总和固定算法 一、介绍 最近项目上遇到了一个需求就是在多个指定区间内生成总和恒定的随机数。 示例：在[1-3]、[4-20]、[24-100]区间上分别生成一个随机数且要求随机数总和为40...
• ## word宏、宏编程以及VBA

万次阅读 多人点赞 2018-12-03 19:55:37
微软的office软件允许用户自己编写，叫VBA的脚本来增加其灵活性，进一步扩充它的能力。 如完成一个一打开word文件同时要打开某个文件的功能，必须要自己编写一段称之为宏的脚本。 具体做法是在菜单栏点击开发工具-...
• hi，好久不见 今天给大家分享一个Rnd函数示例，随机生成包含数字与字母的编号，其中字母...2、添加代码 单击事件 1DimK,a,b,I,Num,X,PAsInteger 2Dimstr,PaAsString 3str="" 4ForI=1To12 5P=Int(Rnd*2) ...
• 分支语句 1 If expression1 Then 2 expressions 3 ElseIf expression2 Then 4 expressions ...注：VBA中等于号和赋值符号都是"=",但并不会冲突，只有在选择语句中“=”才表示是否相等 示例（交互型...
• 内容提要：文章提供三个vba代码生成不重复随机数的案例供学习。对Excel感兴趣的朋友可加Excel学习交流群：284029260（www.itblw.com） vba不重复随机数案例一： 下面的代码，将在A1：A5000单元格产生1-5000的不...
•  使用过随机数的程序员都知道在程序中并不能够实现的真正的完全的随机数函数。随机数函数产生的是通过公式计算出来的...基于产生随机数的原理，两次调用随机数后产生的随机数序列将是一样的，显然，这不是我们的期望
• Problem 一个抽奖软件，效果图如下。...3、编写VBA程序 4、另存为启用宏的xlsm Codes Sub ASD_Click() Dim a As Integer Randomize a = Int(Rnd() * 59 + 1) Range("a14") = a End ...
• -编写高效Excel VBA代码的最佳实践(一) 很多Excel VBA文章和图书都介绍过如何优化VBA代码，使代码运行得更快。下面搜集了一些使Excel VBA代码运行更快的技术和技巧，基本上都是实践经验的总结。如果您还有其它优化...
• 曾经想用VBA做一个斗地主的游戏，只做了一点功能，后来发现可以通过手机玩斗地主，就没有再做下去。不过在excel中加载与显示图片的功能也许以后会派上用场，所以做一个小小的记录。 实现原理 在images目录下存放有...
• 使VBA代码更快且更简洁的方法fanjy 发表于 2006-8-28 13:49:28
• 很多Excel VBA文章和图书都介绍过如何优化VBA代码，使代码运行得更快。下面搜集了一些使Excel VBA代码运行更快的技术和技巧，基本上都是实践经验的总结。如果您还有其它优化Excel VBA代码的方法，可以在本文后留言或...
• 有两个功能，一个是后台生成随机数后按照猜的过程输出结果，一个是根据结果计算可能的数，对于数字位数也有动态支持，但是大于5位数字的猜测极占用内存，并不推荐。代码是本人自己写的。

...