我是vb脚本的新手,请帮助我。如何在vb脚本中每次在开始日期 - 结束日期范围之间生成随机日期DDMMYYYY格式?
我通过随机添加最后两位数字生成随机年份,如下图所示,但我想在用户提供的开始日期和结束日期之间生成随机日期DDMMYYYY格式。
Randomize
tmp = Int((92 - 70 + 1) * Rnd + 70)
tmp1= "01/05/19" & tmp
我是vb脚本的新手,请帮助我。如何在vb脚本中每次在开始日期 - 结束日期范围之间生成随机日期DDMMYYYY格式?
我通过随机添加最后两位数字生成随机年份,如下图所示,但我想在用户提供的开始日期和结束日期之间生成随机日期DDMMYYYY格式。
Randomize
tmp = Int((92 - 70 + 1) * Rnd + 70)
tmp1= "01/05/19" & tmp
以此为出发点
Option Explicit
Function getRandomDate(startDate, endDate)
getRandomDate = DateAdd(_
"d" _
, Fix(DateDiff("d", startDate, endDate) * Rnd) _
, startDate _
)
End Function
Dim startDate, endDate
startDate = CDate("2016/03/10")
endDate = CDate("2017/09/30")
Randomize
Dim i
For i = 0 To 100
WScript.Echo getRandomDate(startDate, endDate)
Next
它只是计算开始和结束日期之间的天数,并选择在此范围内的天随机添加到开始日期。
当使用Rnd()
生成随机数,你一定要使用Randomize
使用系统时间作为种子值或发生这种情况,初始化随机数发生器。
Option Explicit
Function getRandomDate(startDate, endDate)
getRandomDate = DateAdd(_
"d" _
, Fix(DateDiff("d", startDate, endDate) * Rnd) _
, startDate _
)
End Function
Dim startDate, endDate
startDate = CDate("2016/03/10")
endDate = CDate("2017/09/30")
Dim i
For i = 0 To 10
WScript.Echo getRandomDate(startDate, endDate)
Next
1输出:
15/04/2017
07/01/2017
02/02/2017
21/08/2016
28/08/2016
24/05/2017
17/03/2016
16/05/2017
16/06/2017
17/04/2017
04/04/2016
第二组输出:
15/04/2017
07/01/2017
02/02/2017
21/08/2016
28/08/2016
24/05/2017
17/03/2016
16/05/2017
16/06/2017
17/04/2017
04/04/2016
添加Randomize
语句代码看出差别;
Option Explicit
Function getRandomDate(startDate, endDate)
getRandomDate = DateAdd(_
"d" _
, Fix(DateDiff("d", startDate, endDate) * Rnd) _
, startDate _
)
End Function
Dim startDate, endDate
startDate = CDate("2016/03/10")
endDate = CDate("2017/09/30")
Dim i
'Call the random number generator with the system time as the seed.
Call Randomize()
For i = 0 To 10
WScript.Echo getRandomDate(startDate, endDate)
Next
1输出:
14/11/2016
28/09/2016
26/05/2016
06/01/2017
22/09/2016
13/06/2016
12/11/2016
05/03/2017
05/05/2016
01/05/2016
03/02/2017
第二组输出:
08/03/2017
20/01/2017
18/04/2016
29/11/2016
16/08/2016
07/05/2016
06/10/2016
27/01/2017
22/07/2016
19/07/2016
21/09/2017
这是错过一件容易的事情,但使一个很大的区别。
代码(和注释)显示了对(伪)随机数生成的危险误解。随机**序列**中的每一个下一个数字都不能为发电机重新播种。请参阅https://blogs.msdn.microsoft.com/gstemp/2004/02/23/random-thoughts-and-passwords-revised/。 –
@ Ekkehard.Horner不确定,说实话,多年来我用过它,从来没有一个问题,它随机*少*,但如果埃里克说,这是更少,我想我必须承认。感谢您的链接。我必须承认,尽管如此,如果您必须确保在函数运行之前的某个时间点调用了Randomize,那么打包“随机”函数会有点噩梦。 – Lankymart
@ Ekkehard.Horner哇,真的吗?...很好的接触。甚至调整了我的答案,以采纳您的意见。 – Lankymart
Dim Date1 As Date, Date2 As Date
Date1 = 10/02/2017
Date2 = 10/06/2017
iDiff = DateDiff("d", Date1, Date2, vbMonday)
Dim RndDate As Date
Randomize
RndDate = DateAdd("d", Int((iDiff * Rnd) + 1), Date1)
我发现简单的方法来生成随机日期。
没有['Randomize'](https://msdn.microsoft.com/en-us/library/38d7ckek(v = vs.84).aspx)种子将不会是真正的随机 - 从[Rnd Function] (https://msdn.microsoft.com/en-us/library/e566zd96(v=vs.84).aspx) - *“在调用Rnd之前,使用不带参数的Randomize语句来初始化随机数生成器一个基于系统计时器的种子。“* – Lankymart
@Lankymart,我知道,谢谢。现在包括。由于最初的代码包含了它,我决定发布最低限度的代码来说明使用情况,但可能我应该包含它。 –
我会在'getRandomDate()'调用中保留'Randomize',这种方式是自包含的,并且在将来调用'getRandomDate()'时不太可能会错过。 – Lankymart