Just in case that wasn't quite what you were after, here's a possible approach. Lots of with clauses so you can follow the steps:
with data as
(
select date '2017-06-01' start_date
,date '2018-04-01' end_date
from dual)
,ranges as
(
select start_date
,end_date
,months_between(end_date,start_date) + 1 months
from data
)
,numbers as
(
select level l
from ranges
connect by level <= months
)
,months as
(
select ranges.start_date
,add_months(ranges.start_date,numbers.l - 1) monthstart
,last_day(add_months(ranges.start_date,numbers.l - 1)) monthend
,last_day(add_months(ranges.start_date,numbers.l - 1)) - add_months(ranges.start_date,numbers.l - 1) + 1 days
from numbers
,ranges
)
select monthstart + trunc(dbms_random.value(0,days)) randomdate
from months
;
RANDOMDATE
--------------------
13-Jun-2017 00:00:00
30-Jul-2017 00:00:00
19-Aug-2017 00:00:00
02-Sep-2017 00:00:00
24-Oct-2017 00:00:00
23-Nov-2017 00:00:00
10-Dec-2017 00:00:00
02-Jan-2018 00:00:00
05-Feb-2018 00:00:00
14-Mar-2018 00:00:00
28-Apr-2018 00:00:00