51,407
社区成员
发帖
与我相关
我的任务
分享
(我主要是不知道如何在Java中产生常见数据类型的随机数)Random r = new Random();
int randomInt = r.nextInt();
long randomLong = r.nextLong();
double randomDouble = r.nextDouble();
float randomFloat = r.nextFloat();
int randomIntInRealm = r.nextInt(25);
double randomDoubleFromMath = Math.random();
用Random类更方便,可以获取多种类型的随机数,而Math.random()方法只返回一个0到1之间的double值,相当于Random.nextDouble()方法。
这里只列出了Random类里的一部分常用方法,其实它也有nextBoolean,nextBytes等方法。
nextInt返回所有int的可能值,有2的32次方种可能,nextLong也同理,返回long的所有可能取值。
nextFloat和nextDouble都是返回0到1之间的一个浮点数,包括0,不包括1,也就是返回0和返回0.111的概率是相同的,但是永远不返回1.0
API作者非常好,提供了nextInt(int)这个重载方法,如果不提供这个,那要想获得1到25的随机int,可就麻烦了,要先取一个0到1之间的浮点数,这时,0到1相当于1到26,则要得的数x与取到的随机数r之间的关系是1 - r = (25 - x) / 25,然后再计算再取整。。。。。。反正很麻烦。
有个nextInt(int)这个重载方法,很easy了,nextInt(int n)方法的返回值是0到n之间的随机整数,包括0,不包括25,因此,你想要1到25之间的随机数,包括1和25,就可以写成
int randomIntInRealm = r.nextInt(25) + 1;
好,这个问题说完了,下面说你的需求,需求里有一个“不能重复”,这就使这个问题从生成随机数往格子里填的问题变成了一个洗牌问题(shuffle)。如果你生成一个随机数,判断不重复填进去,重复就再生成,那越到后来,重复的可能性越大,程序效率非常低。
这种不重复的随机数实际上非常像洗牌,不重复的25个牌,变换位置,这样,你的随机数生成的就不是要往里填的数,而是一个位置。先把1到25顺序填进25个格子里,然后从第一个格开始到最后一个格子,25次循环,每次生成一个随机数,把当前位置的数与随机数位置的数字对换,这样循环下来,25个数就被打乱了。