2017-02-10 96 views

回答

5

以此为出发点

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 

它只是计算开始和结束日期之间的天数,并选择在此范围内的天随机添加到开始日期。

+2

没有['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

+0

@Lankymart,我知道,谢谢。现在包括。由于最初的代码包含了它,我决定发布最低限度的代码来说明使用情况,但可能我应该包含它。 –

+0

我会在'getRandomDate()'调用中保留'Randomize',这种方式是自包含的,并且在将来调用'getRandomDate()'时不太可能会错过。 – Lankymart

0

作为附录@mc-ndanswer

当使用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 

这是错过一件容易的事情,但使一个很大的区别。

+0

代码(和注释)显示了对(伪)随机数生成的危险误解。随机**序列**中的每一个下一个数字都不能为发电机重新播种。请参阅https://blogs.msdn.microsoft.com/gstemp/2004/02/23/random-thoughts-and-passwords-revised/。 –

+0

@ Ekkehard.Horner不确定,说实话,多年来我用过它,从来没有一个问题,它随机*少*,但如果埃里克说,这是更少,我想我必须承认。感谢您的链接。我必须承认,尽管如此,如果您必须确保在函数运行之前的某个时间点调用了Randomize,那么打包“随机”函数会有点噩梦。 – Lankymart

+0

@ Ekkehard.Horner哇,真的吗?...很好的接触。甚至调整了我的答案,以采纳您的意见。 – Lankymart

-2
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) 

我发现简单的方法来生成随机日期。

+0

是不是@ mc-nd已经[回答](http://stackoverflow.com/a/42154281/692942)? – Lankymart

+1

您也意识到,在VBScript中不支持“As”,您在VBScript中称它为“Microsoft VBScript编译错误:预期的语句结束”将失败。 – Lankymart

相关问题