2017-02-10 10 views
-1

Я новичок в скриптах vb, пожалуйста, помогите мне.Как создать случайную дату Формат DDMMYYYY между датой окончания даты и датой каждый раз в скриптах vb?

Я генерирую случайный год, добавляя последние две цифры случайным образом, как показано ниже, но я хочу создать случайный формат даты DDMMYYYY между датой начала и датой окончания, предоставленной пользователем.

Randomize 
tmp = Int((92 - 70 + 1) * Rnd + 70) 
tmp1= "01/05/19" & tmp 

ответ

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] (https://msdn.microsoft.com/en-us/library/e566zd96(v=vs.84).aspx) - * «Перед вызовом Rnd используйте оператор Randomize без аргумента для инициализации генератора случайных чисел с помощью семя, основанное на системном таймере ». * – Lankymart

+0

@ Lankymart, я знаю, спасибо. Теперь включено. Поскольку исходный код включил его, я решил опубликовать минимальный минимум, чтобы продемонстрировать использование, но, вероятно, я должен был включить его. –

+0

Я бы сохранил 'Randomize' внутри' getRandomDate() 'так, чтобы он был самодостаточным и с меньшей вероятностью пропустил при вызове' getRandomDate() 'в будущем. – Lankymart

0

В качестве дополнения к @mc-nd «s answer

При использовании 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 

первый выход:

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 

первого выхода:

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

Вы также понимаете, что 'As' не поддерживается в VBScript, который вы вызываете, что в VBScript он завершится с ошибкой компиляции Microsoft VBScript: ожидаемый конец инструкции'. – Lankymart