一.引言:很多时候,我们需要产生随机数,但可能考虑的不是特别全面,比如没有考虑如果产生相同的随机数呢(当然前提是我们的程序需求是不能产生相同的随机数)。
二.正文:首先说一个应用场景:比如我们做扫雷游戏的时候,需要产生10个雷,假设雷区是9*9的 ,并且假设有雷的话用true表示。我们想到最简单的方法:但这种方法如果产生了两个相同的index,就会使两个雷重复放置,相当于少了一个雷。
int maxLen = 9*9;
for(int count = 0; count < 10; count++) {
int index = (int) (Math.random() * maxLen);
mines[index/9][index%9] = true;
}
我们可以这样处理:
//先初始化minesArray
int[] minesArray = new int[9 * 9];
for(int index = 0; index < minesArray.length; index++) {
minesArray[index] = index;
}
//产生随机数,并把minesArray[index]和minesArray[maxLen-1]交换
//重点就是这个交换
for(int count = 0; count < 10; count++) {
int index = (int) (Math.random() * maxLen);
tmp = minesArray[index];
minesArray[index] = minesArray[maxLen - 1];
minesArray[maxLen - 1] = tmp;
maxLen--;
}
//最后出现雷的地方就是minesArray数组最后十个元素,通过这个得到mines[num / hCount][num % hCount];
for(int index = minesArray.length - mineCount; index < minesArray.length; index++) {
int num = minesArray[index];
mines[num / hCount][num % hCount] = true;
}
三.总结:不知道大家明白没,其实不用这种方法也可以,比如出现重复的时候就跳过,重新产生当然也可以,不过要结合自己的实际情况,这种方法还适用于发牌游戏等程序。