/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

import java.util.concurrent.ThreadLocalRandom ;
import java.util.TreeMap ;

import java.time.*;
import java.time.format.*;
import java.time.temporal.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
	public static void main (String[] args) throws java.lang.Exception
	{
		Ideone app = new Ideone();
		app.doIt();
	}
	
	public void doIt() {
		ZoneId z = ZoneId.of( "America/Montreal" ) ;
		int count = 10 ;
		LocalDate today = LocalDate.now( z );
		LocalDate laterDate = today.plusDays( count );
		Instant start = today.atStartOfDay( z ).toInstant();
		Instant stop = laterDate.atStartOfDay( z ).toInstant();
		
		// Collect the frequency of each date. We want to see bias towards earlier dates.
		List<LocalDate> dates = new ArrayList<>( count );
		Map<LocalDate , Integer > map = new TreeMap<LocalDate , Integer >();
		for( int i = 0 ; i <= count ; i ++ ) {
			LocalDate localDate = today.plusDays( i ) ; 
			dates.add( localDate );  // Increment to next date and remember.
			map.put( localDate , new Integer( 0 ) ); // Prepopulate the map with all dates.
		}
		for( int i = 1 ; i <= 10_000 ; i ++ ) {
			Instant instant = this.getRandomInstantBetween( start , stop );
			LocalDate localDate = instant.atZone( z ).toLocalDate();
			Integer integer = map.get( localDate );
			map.put( localDate , integer +  1);  // Increment to count each time get a hit on this date.
		}
		System.out.println( map );
	}
	
	public Instant getRandomInstantBetween( Instant early , Instant late) {

        Duration duration = Duration.between( early , late ) ;
        // Assert the duration is positive or zero: ( ! duration.isNegative() )
        
        long bound = duration.toNanos() ;
        ThreadLocalRandom random = ThreadLocalRandom.current() ;
        long nanos1 = random.nextLong( 0 , bound ); 
        long nanos2 = random.nextLong( 0 , bound ); 
        long nanos = Math.min( nanos1 , nanos2 );  // Select the lesser number.
        Instant instant = early.plusNanos( nanos );
        
        return instant;
	}
}