产生不重复的随机数小技巧

一.引言:很多时候,我们需要产生随机数,但可能考虑的不是特别全面,比如没有考虑如果产生相同的随机数呢(当然前提是我们的程序需求是不能产生相同的随机数)。

二.正文:首先说一个应用场景:比如我们做扫雷游戏的时候,需要产生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;

}

三.总结:不知道大家明白没,其实不用这种方法也可以,比如出现重复的时候就跳过,重新产生当然也可以,不过要结合自己的实际情况,这种方法还适用于发牌游戏等程序。

猜你喜欢

转载自blog.csdn.net/los_ATend/article/details/79378290