我试着将时间分成相等的间隔,然后在间隔中随机选择一个时间。举个例子:将上午8点到晚上8点的时间分成4个(可以是2或3……)。我会得到8-11,11-2,2-5和5-8。然后在每个示例的间隔2中随机选择一个时间,并具有11:32:12。
我的函数是这样开始的
private static List<Interval> splitDateTime(long start, long end, int intervalNo) {
long interval = (end - start) / intervalNo;
List<Interval> list = new ArrayList<Interval>();
for (long i = start + interval; i < end; i += interval) {
list.add(new Interval(start, i));
start=start + interval;
}
list.add(new Interval(start, end));
for (Interval t:list){
System.out.println(rant);
}
return list;
}那么我该怎么做呢?你有没有一些库/代码/想法?乔达?
首先要感谢大家!
发布于 2018-03-30 11:58:36
从你的原始问题的评论中,看起来你在这里真正问的是如何在两个间隔之间获得一个随机的长值。这可以使用Random来完成。
import java.util.Random
Random rand = new Random();
long val = rand.nextLong(50); //Returns a random value between 0 and 49因此,如果您想要获取某个间隔内的值:
long val = rand.nextLong([max]-[min]) + [min];显然,将max替换为间隔的结束,将min替换为间隔的开始。
编辑:忘记提一下,这会给你一个值[min,max](不包括max)。如果您希望它包含在内,只需在范围中添加1:
long val = rand.nextLong([max]-[min]+1) + [min];发布于 2018-03-30 11:59:13
在没有任何库的情况下,您可以在从您的方法获得间隔列表并获取所需的间隔列表后尝试此代码:
public long getRandomTimeFrom(Interval interval) {
Random r = new Random(); // random instatnce can be shared as class (static) field
return interval.getStart() + r.nextLong(interval.getEnd() - interval.getStart());
}发布于 2018-03-30 13:04:55
这应该是可行的:
SecureRandom s = new SecureRandom();
public Interval randomInterval(long start, long end, int intervalNo) {
if(intervalNo == 0 || end <= start || (end-start)/intervalNo <= 1){
return null;
}
if(intervalNo == 1){
return new Interval(start, end);
}
System.err.println(start + " "+ end+" "+ intervalNo);
long interval = (end - start) / (intervalNo);
long value = Math.abs(s.nextInt(intervalNo));
long randomStart = start + (value*interval);
long randomEnd = start + ((value+1)*interval);
if(randomStart < start || randomStart > end || randomEnd <start || randomEnd > end || randomEnd < randomStart){
throw new RuntimeException("Start: "+start+" End: "+end+" RandomStart:"+randomStart+" RandomEnd:"+randomEnd);
}
return new Interval(randomStart, randomEnd);
}
@org.junit.Test
public void splitDateTime() {
for(int i=0;i<100000;i++){
int randomRange = Math.abs(s.nextInt())%100;
long start = System.currentTimeMillis();
long random = s.nextLong();
long end = start + (random %10000000+ System.currentTimeMillis())/10;
System.err.println(i+": "+randomInterval(start, end, randomRange));
}
}https://stackoverflow.com/questions/49567971
复制相似问题