VBA,大神们帮忙看下为什么产生的两组随机数相同呢。
SubMacro1()DimArr1,Arr2(1To13,1To15000),Temp1Fori=1To15000i=i+1Arr1=Array("1","2","3"...
Sub Macro1()
Dim Arr1, Arr2(1 To 13, 1 To 15000), Temp1
For i = 1 To 15000
i = i + 1
Arr1 = Array(" 1 ", " 2 ", " 3 ", " 4 ", " 5 ", " 6 ", " 7 ", " 8 ", " 9 ", " 10 ", " 11 ", " 12 ", " 13 ")
Temp1 = 0
Do Until UBound(Arr1) < 0
Temp1 = Temp1 + 1
a = Arr1(Int(Rnd * (UBound(Arr1, 1) + 1)))
Arr1 = Filter(Arr1, a, False)
Arr2(Temp1, i) = a
Loop
i = i + 1
Arr1 = Array(" 1 ", " 2 ", " 3 ", " 4 ", " 5 ", " 6 ", " 7 ", " 8 ", " 9 ", " 10 ", " 11 ", " 12 ", " 13 ")
Temp1 = 0
Do Until UBound(Arr1) < 0
Temp1 = Temp1 + 1
a = Arr1(Int(Rnd * (UBound(Arr1, 1) + 1)))
Arr1 = Filter(Arr1, a, False)
Arr2(Temp1, i) = a
Loop
Next
Randomize
Range(Cells(2, 1), Cells(14, 15000)) = Arr2
Randomize
Range(Cells(16, 1), Cells(28, 15000)) = Arr2
End Sub 展开
Dim Arr1, Arr2(1 To 13, 1 To 15000), Temp1
For i = 1 To 15000
i = i + 1
Arr1 = Array(" 1 ", " 2 ", " 3 ", " 4 ", " 5 ", " 6 ", " 7 ", " 8 ", " 9 ", " 10 ", " 11 ", " 12 ", " 13 ")
Temp1 = 0
Do Until UBound(Arr1) < 0
Temp1 = Temp1 + 1
a = Arr1(Int(Rnd * (UBound(Arr1, 1) + 1)))
Arr1 = Filter(Arr1, a, False)
Arr2(Temp1, i) = a
Loop
i = i + 1
Arr1 = Array(" 1 ", " 2 ", " 3 ", " 4 ", " 5 ", " 6 ", " 7 ", " 8 ", " 9 ", " 10 ", " 11 ", " 12 ", " 13 ")
Temp1 = 0
Do Until UBound(Arr1) < 0
Temp1 = Temp1 + 1
a = Arr1(Int(Rnd * (UBound(Arr1, 1) + 1)))
Arr1 = Filter(Arr1, a, False)
Arr2(Temp1, i) = a
Loop
Next
Randomize
Range(Cells(2, 1), Cells(14, 15000)) = Arr2
Randomize
Range(Cells(16, 1), Cells(28, 15000)) = Arr2
End Sub 展开
3个回答
展开全部
1、首先,Randomize 只需要用一次就可以了。而且要在产生随机数前调用。你上面的代码,先产生
随机数然后再初始化随机数函数,这样是不行的。
2、其次,你这个代码产生随机序列相同的原因跟 Randomize 没有任何关系。原因在于你两个产生随机
数的 DO循环里面都是这样给数组 Arr2 赋值的,Arr2(Temp1, i) = a。而Temp1的范围都是一样的,
所以你第二次循环里面就把第一次产生的数给覆盖掉了。
3、解决办法:
一、在每个循环结束后马上使用随机数,即第一个循环结束后马上用
Range(Cells(2, 1), Cells(14, 15000)) = Arr2 然后再产生新的随机数。
二、再定义一个数组,把两次产生的随机数放到不同数组中。
三、扩大数组第一维的范围,并且使两个Arr2(Temp1, i) = a 中Temp1的值值不一样。
随机数然后再初始化随机数函数,这样是不行的。
2、其次,你这个代码产生随机序列相同的原因跟 Randomize 没有任何关系。原因在于你两个产生随机
数的 DO循环里面都是这样给数组 Arr2 赋值的,Arr2(Temp1, i) = a。而Temp1的范围都是一样的,
所以你第二次循环里面就把第一次产生的数给覆盖掉了。
3、解决办法:
一、在每个循环结束后马上使用随机数,即第一个循环结束后马上用
Range(Cells(2, 1), Cells(14, 15000)) = Arr2 然后再产生新的随机数。
二、再定义一个数组,把两次产生的随机数放到不同数组中。
三、扩大数组第一维的范围,并且使两个Arr2(Temp1, i) = a 中Temp1的值值不一样。
追问
第一种方法可以,但是我如果想产生n组的话,如何改比较简单。
追答
后面两种不行吗?
Do Until UBound(Arr1) < 0
Temp1 = Temp1 + 1
a = Arr1(Int(Rnd * (UBound(Arr1, 1) + 1)))
Arr1 = Filter(Arr1, a, False)
Arr2(Temp1, i) = a
Loop
i = i + 1
Arr1 = Array(" 1 ", " 2 ", " 3 ", " 4 ", " 5 ", " 6 ", " 7 ", " 8 ", " 9 ", " 10 ", " 11 ", " 12 ", " 13 ")
Temp1 = 0 ‘把这句话去掉,即让下面产生的随机数跟在上面的后面而不是覆盖。当然定义的范围你自己改。具体就是 temp1 在[1,13]里面放的第一组随机数, 在[14,26]里面放的是第二组随机数。其实你要产生多少组就定义多少个数组这样更简单容易理解点
Do Until UBound(Arr1) < 0
Temp1 = Temp1 + 1
a = Arr1(Int(Rnd * (UBound(Arr1, 1) + 1)))
Arr1 = Filter(Arr1, a, False)
Arr2(Temp1, i) = a
Loop
Next
展开全部
没仔细看你的代码,但是根据你的程序流程来看,第一次输出Arr2和第二次输出ARR2之间的间隔没有任何对数组变更的操作,所以你输出的数据不会有变化。
追问
如何初始化随机器使产生的两组随机数不同呢。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询