非重复随机排序算法

Non-repeat random for sorting algorithm

本文关键字:排序 算法 随机      更新时间:2023-09-26

我有这段代码,生成从1到12的12个数字,然后排序算法将其排序,同时打印出矩阵中的每一步。

这都很好,但我需要从1到12的非重复随机数。

知道我该怎么做吗?

var a = new Array(12);
var i,j,k,key;

for (j=0; j<12; j++){
    a[j]=Math.floor(Math.random()*(13-1)+1);

}

document.write("Numbers:");
document.write("<TABLE align=center border=0><TR>");
for (j=0; j<12; j++){
    document.write("<TD align=right  width=20>",a[j],
    "</TD>");
}     
document.write("</TR></TABLE><CENTER><HR></CENTER>")

for (j=1; j<12; j++){
    key = a[j]; i=j-1;
    while (i>=0 && a[i]>key){
            a[i+1] = a[i]; i--
    }
    a[i+1] = key;
    document.write("<TABLE align=center border=0><TR>");
    for (k=0; k<12; k++){
                if (i<k && k<=j){
        document.write("<TD align=right width=20>",
                    "<FONT COLOR=#ff3333>",a[k],"</FONT></TD>");}
                    else{
        document.write("<TD align=right width=20>",
                    a[k],"</TD>");}
    }     
    document.write("</TR></TABLE>")
}     

您可以创建一个包含12个数字的数组:

var nums = [1,2,3,4,5,6,7,8,9,10,11,12];
// or
var nums = [],
    max = 12;
for (var i = 1; i <= max; i++)
    nums.push(i);

然后随机洗牌:

nums.sort(function(a,b){ return Math.random() - 0.5; });

从你传递给.sort()的回调中返回一个随机数是一种hack,但它在非正式使用中工作得很好,其中包含真正随机排序的代码将是多余的。

演示:http://jsfiddle.net/5hN6t/1/

我认为你所需要做的就是设置种子。

看David Bau的回答:

可种子JavaScript随机数生成器

下面的代码用1到12的值填充数组,然后随机洗牌。

var list = [];
for(var i=1; i<=12; i++) {
    list.push(i);   
}
for(var i=0; i<12; i++) {
    var index = Math.floor(Math.random() * 12);
    var tmp = list[i];
    list[i] = list[index];
    list[index] = tmp;
}

下面是一个工作示例:http://jsfiddle.net/k2jh2/