我正在尝试编写一个方法,该方法将两个java.util.Date
作为参数,并在Scala中的这两个之间返回一个随机java.util.Date
。但是,每次都得到相同的虚拟结果。我的代码出了什么问题?
randomDateBetween(new Date(2017, 1, 1), new Date(2018, 1, 1))
一如既往地返回Tue Jun 12 09:36:00 EET 3917
def randomDateBetween( firstDate : Date, secondDate : Date) : Date =
{
val ratio = new Random().nextInt(100);
val difference = (secondDate.getTime - firstDate.getTime)
val surplusMillis = (difference * (ratio / 100.0)).asInstanceOf[Long]
val cal = Calendar.getInstance()
cal.setTimeInMillis(surplusMillis + firstDate.getTime)
return cal.getTime()
}
我修好了他们,谢谢你。导致错误的原因是java.util.Date被弃用。我像这样改变了我的方法调用,它工作得非常好:
val date1 = Calendar.getInstance
val date2 = Calendar.getInstance
date1.set(2017, 1, 1)
date2.set(2018, 1, 1)
randomDateBetween(date1.getTime, date2.getTime)
答案 0 :(得分:3)
你需要像这样播种Random对象:
Random.setSeed(System.currentTimeMillis())
val ratio = new Random().nextInt(100)
答案 1 :(得分:1)
(这里是Java语法,而不是Scala)
ThreadLocalRandom
Answer by sheunis是正确但过时的。
另一个过时的选项是Math.random
。
randomNum = minimum + ( int )( Math.random() * maximum );
自Java 7以来的现代方法是ThreadLocalRandom
。请参阅此Answer。
long random = ThreadLocalRandom.current().nextLong( minimum , maximum + 1 );
Random
的这两种替代方法都是使用内部生成的种子初始化的,否则可能无法修改。
此外,您正在使用麻烦的旧日期时间类Date
和Calendar
,这些类现在是遗留的,已被java.time类取代。
对于没有时间且没有时区的仅限日期的值,请使用LocalDate
类。
LocalDate start = LocalDate.of( 2017 , Month.JANUARY , 1 ) ;
LocalDate stop = LocalDate.of( 2018 , Month.JANUARY , 1 ) ;
计算天数,以确定随机天数。
long maxDays = ChronoUnit.DAYS.between( start , stop ) ;
所以我们想要添加一个随机天数,小到零和maxDays
。
long days = ThreadLocalRandom.current().nextLong( 0 , maxDays + 1 );
LocalDate ld = start.plusDays( days ) ;
答案 2 :(得分:0)
Date randomDate= new Date(ThreadLocalRandom.current().nextLong(fromDate.getTime(), toDate.getTime()+1));
我对scala不太了解。我在java中测试过,我认为这个解决方案也适用于scala。如果需要,请修改代码。