Java 什么';这个随机的出生日期生成器有什么问题?

Java 什么';这个随机的出生日期生成器有什么问题?,java,random,Java,Random,我正在尝试为25到50年前的出生日期编写一个随机的出生日期生成器。我坚持使用Java1.4,并试图通过Java.util.Calendar(是的,是的,我知道我应该使用Joda库)来实现这一点。这就是我所处的位置: private static long ONE_YEAR_AS_MILLISECONDS = 365*24*60*60*1000; private static long TWENTY_FIVE_YEARS_AS_MILLISECONDS = 25*ONE_YEAR_AS_MILLI

我正在尝试为25到50年前的出生日期编写一个随机的出生日期生成器。我坚持使用Java1.4,并试图通过Java.util.Calendar(是的,是的,我知道我应该使用Joda库)来实现这一点。这就是我所处的位置:

private static long ONE_YEAR_AS_MILLISECONDS = 365*24*60*60*1000;
private static long TWENTY_FIVE_YEARS_AS_MILLISECONDS = 25*ONE_YEAR_AS_MILLISECONDS;
private static long FIFTY_YEARS_AS_MILLISECONDS = 50*ONE_YEAR_AS_MILLISECONDS;

private static String generateDOB()
{
    //Equation for calculating a random number within a given range is as follows:  Min + (int)(Math.random() * ((Max - Min) + 1))
    long someTimeBetween25And50YearsInMilliSeconds = TWENTY_FIVE_YEARS_AS_MILLISECONDS + 
                (long)(Math.random() * ((FIFTY_YEARS_AS_MILLISECONDS - TWENTY_FIVE_YEARS_AS_MILLISECONDS) + 1));
    Calendar dob = Calendar.getInstance();
    dob.setTimeInMillis(dob.getTimeInMillis() - someTimeBetween25And50YearsInMilliSeconds);
    StringBuffer sb = new StringBuffer();
    sb.append(dob.get(Calendar.YEAR)).append("/").append(dob.get(Calendar.MONTH)+1).append("/").append(dob.get(Calendar.DAY_OF_MONTH));
    return sb.toString();
}
它执行OK,但100个日期的输出将在2008年或2009年对所有日期执行:

2008/10/8
2008/9/22
2008/7/26
2008/8/20
2008/3/31
2008/10/1
2009/1/3
2009/2/2
2009/4/9
2008/9/20
...

但是,我需要25-50年前的日期。我遗漏了什么?

很好地解决了这个问题,但是您的
一年\u作为\u毫秒
常量中出现了一个数字溢出

将整数文本更改为长文本:

private static long ONE_YEAR_AS_MILLISECONDS = 365L * 24L * 60L * 60L * 1000L;
现在对我来说很好

编辑

因此,当我在解决这个问题时,我没有使用
日历
类:

Date d = new Date(System.currentTimeMillis() - someTimeBetween25And50YearsInMilliSeconds);

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
return sdf.format(d);

对我来说,这看起来更容易理解。

很好地解决了这个问题,但是您的
一年\u作为\u毫秒
常量中出现了一个数字溢出

将整数文本更改为长文本:

private static long ONE_YEAR_AS_MILLISECONDS = 365L * 24L * 60L * 60L * 1000L;
现在对我来说很好

编辑

因此,当我在解决这个问题时,我没有使用
日历
类:

Date d = new Date(System.currentTimeMillis() - someTimeBetween25And50YearsInMilliSeconds);

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
return sdf.format(d);

对我来说,这看起来更容易理解。

我不确定你遗漏了什么,但我会使用Calendar.roll

private static String generateDOB()
{

    Calendar dob = Calendar.getInstance();

    int year = (int)(Math.random() * 25) + 25;


    dob.roll(Calendar.YEAR, -year);
    StringBuffer sb = new StringBuffer();
    sb.append(dob.get(Calendar.YEAR)).append("/").append(dob.get(Calendar.MONTH)+1).append("/").append(dob.get(Calendar.DAY_OF_MONTH));
    return sb.toString();
}

我不确定您缺少什么,但我会使用Calendar.roll

private static String generateDOB()
{

    Calendar dob = Calendar.getInstance();

    int year = (int)(Math.random() * 25) + 25;


    dob.roll(Calendar.YEAR, -year);
    StringBuffer sb = new StringBuffer();
    sb.append(dob.get(Calendar.YEAR)).append("/").append(dob.get(Calendar.MONTH)+1).append("/").append(dob.get(Calendar.DAY_OF_MONTH));
    return sb.toString();
}

伟大的这真是个难题。绝对是a+1!哦,好地方!非常感谢(以及为摆脱日历而获得的额外荣誉)太棒了!这真是个难题。绝对是a+1!哦,好地方!非常感谢您的记录,即使您的代码被更正了,您的代码也不会累积,因为一年中有超过365天的时间。25年后,你将被关闭三天,因此你的范围不会是25-50年,你将有一个3-7天的错误窗口。记录在案,即使更正,你的代码也不会累积,因为一年中有365天以上。25年后,你会有3天的时间间隔,所以你的时间范围不会是25-50年,你会有3-7天的错误窗口。