JavaScript的shuffle演算法(發亂數不重複)

謝謝william大,這個演算法叫做shuffle,謝謝XD(詳情請參考他的回應~)

那這個演算法主要的目的就是把亂數全部打散(就像是撲克牌的發牌),因為本來就是從一組很有規律的陣列來打散的,所以每一次取用這個陣列必然都是不一樣的值,應該是蠻實用的

以下是流程和自行實作解釋,真正的程式碼在此,請多利用語言的內建API XD

var myarray = 這裡是你自己的陣列;
myarray.sort(function() {return 0.5 – Math.random()})//真正的排序方法,用Java的說法,這裡是在實作IComparator,看不懂的話就抄吧


重新排序完之後,從1開始抽這個陣列,用掉一個就pop掉一個,這樣就一定會完成「洗牌」的動作了,有沒有簡單又可愛呢XD

跳轉之後看我畫的虛擬碼,為什麼會用畫的呢,因為這是我之前拿去中崙資研社上課的時候怕小朋友不懂,所以直接畫出來

以下就是poker演算法的虛擬碼,有這個流程應該可以用任何一種程式語言實作才對XD

arth

那既然標題寫了JavaScript,那就看一下JavaScript該怎麼實作吧

首先得先需要一個可以決定亂數範圍的函數,JavaScript的Math.random不像C#裡的Random class已經內建了指定亂數範圍的method

function random(max, min) {
    return Math.floor(Math.random() * (max – min + 1)) + min;
}

所以利用上面的函式就可以把亂數鎖定在固定的範圍內

接下來就是實作poker演算法了

function poker(source, length) {
    var temparr;
    if (length <= source.length) {
        temparr = source;
    } else {
        temparr = new Array(length);
        for (var i = 0; i < length; i++) {
            temparr[i] = source[i % source.length];
        }
    }
    for (var i = 0; i < temparr.length; i++) {
        var j = random(temparr.length – 1, 0);
        var temp = temparr[i];
        temparr[i] = temparr[j];
        temparr[j] = temp;
    }
    return temparr.slice(0, length);
}

這隻函式我把它改的比較複雜,一般的poker需要的陣列乍看之下會以為數字是一定要是連續的,但是poker演算法的重點是調換陣列中所有的元素位置,所以原始陣列的長度不是很大的重點,在原始陣列傳入之後可以再重新再產生一個新的陣列,比如[1,2,3,4]的長度只有4,但是要是我希望能夠隨機發20次的話,那就只能再把他接的更長,之後針對新的陣列作抽牌的動作,等到全部都完成了,在取出指定長度的陣列回傳,這樣就有一個在指定範圍內的亂數陣列了,不過我想像我之前須要把更小的陣列給重複接起來的情況應該不會很常見就是了

至於原始陣列怎麼來……會來看這張網頁的人應該都知道該怎麼產生陣列吧XD

廣告

3 thoughts on “JavaScript的shuffle演算法(發亂數不重複)

  1. 引用通告: 我忘了(不重複亂數洗牌法) – CatMao

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s