「算法」掃雷—等機率隨機分布

「算法」掃雷—等概率隨機分佈

在製作掃雷遊戲中,一般要隨機雷局,對該區域貼圖(完整代碼請關注學點乾貨,轉發此文後私信獲取)

一種思路:先順序排列,然後隨機亂序**次

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);

}


分享到:


相關文章: