在製作掃雷遊戲中,一般要隨機雷局,對該區域貼圖(完整代碼請關注學點乾貨,轉發此文後私信獲取)
一種思路:先順序排列,然後隨機亂序**次
private void generateMines(int mineNumber){
for(int i = 0 ; i < mineNumber ; i ++){
int x = i/M;
int y = i%M;
mines[x][y] = true;
}
int swapTime = M*N;
for(int i = 0 ; i < swapTime ; i ++){
int x1 = (int)(Math.random() * N);
int y1 = (int)(Math.random() * M);
int x2 = (int)(Math.random() * N);
int y2 = (int)(Math.random() * M);
swap(x1, y1, x2, y2);
}
}
一個好的亂序算法,應該在可以得到的排序結果中,等概率分佈。
for(int i = N*M-1; i >= 0 ; i-- ){
int iX = i/M;
int iY = i%M;
int randNumber = (int)(Math.random()*(i+1));
int randX = randNumber/M;
int randY = randNumber%M;
swap(iX, iY, randX, randY);
}
//常用隨機,非等概率,可以測試
private void shuffle(int[] arr){
for(int i = 0; i < n ; i-- ){
int x = (int)(Math.random()*n);
swap(arr, i, x);
}
//等概率分佈洗牌算法
private void shuffle(int[] arr){
for(int i = 0; i < n ; i-- ){
//在[i,n)區間隨機選擇元素
int x = (int)(Math.random()*(n-i) + i);
swap(arr, i, x);
}
閱讀更多 學點乾貨 的文章