【问题标题】:Non-repeat random for sorting algorithm非重复随机排序算法
【发布时间】:2014-04-12 22:51:47
【问题描述】:

我有这段代码可以生成从 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>")
}     

【问题讨论】:

  • 你生成一个 1-12 的数字列表,随机播放列表,然后根据需要 pop()。
  • @Blorgbeard:究竟如何在 js 中实现它?
  • @dandavis 在我脑海中浮现,不知道——虽然这不是一个复杂的算法。如果我对 JS 更加熟悉,我会发布一个实际的答案,而不仅仅是评论。
  • FY 算法出现在答案中,这是一个 js 实现:stackoverflow.com/a/2450976/312962

标签: javascript sorting random


【解决方案1】:

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

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/

【讨论】:

    【解决方案2】:

    这是一个代码,它用 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/

    【讨论】:

    • 这不是 Fisher-Yates 算法的正确实现。
    • 抱歉,我没有看到任何关于这将是 Fisher-Yates 算法的声明。这是我首先想到的并达到目的。
    • Fisher-Yates 算法保证所有排列具有相同的概率。您的算法没有这个所需的属性。 n^n 不能被 n 整除!对于 n > 2。
    • 感谢您解释显而易见的事情。同样,我不记得说过任何关于完美随机性的事情。即使您在 javascript 中执行 Fisher-Yates 算法的确切实现。你真的能说你使用的随机数生成器产生了完美的随机数吗?你猜怎么了?你不能。因此,即使这样也不会产生具有“所需属性”的东西。问题不是关于完美的随机性。因此,我看不出我的答案是错误的。
    • 如果有一个数学上正确且易于实现的算法,与您的程序的行数相同,我认为没有理由满足于有点随机的算法。我认为社区值得更好。
    【解决方案3】:

    我认为你只需要设置种子。

    看看大卫鲍的回答:

    Seedable JavaScript random number generator

    【讨论】:

      猜你喜欢
      • 2011-10-30
      • 2018-11-06
      • 1970-01-01
      • 1970-01-01
      • 2011-11-12
      • 2018-11-13
      • 2020-05-11
      相关资源
      最近更新 更多