【问题标题】:javascript to generate 50 no-repeat random numbers [duplicate]javascript生成50个不重复随机数[重复]
【发布时间】:2012-05-28 12:13:35
【问题描述】:

我想用javascript生成50个不重复的随机数,数字在1到50之间,怎么实现呢?50个数字存储在一个数组中。

【问题讨论】:

    标签: javascript


    【解决方案1】:

    首先生成一个有序列表:

    var i, arr = [];
    for (i = 0; i < 50; i++) {
        arr[i] = i + 1;
    }
    

    然后随机播放。

    arr.sort(function () {
        return Math.random() - 0.5;
    });
    

    我测试了上述方法,效果很好。但是,ECMAScript 规范并不要求 Array.sort 以这种方法生成真正随机列表的方式实现 - 因此虽然它现在可能有效,但结果可能会在没有警告的情况下发生变化。下面是 Fisher-Yates shuffle 的一个实现,它不仅保证产生合理的随机分布,而且比劫持排序更快。

    function shuffle(array) {
        var p, n, tmp;
        for (p = array.length; p;) {
            n = Math.random() * p-- | 0;
            tmp = array[n];
            array[n] = array[p];
            array[p] = tmp;
        }
    }
    

    【讨论】:

    • 您的代码有一个小错误,因为我从 1 开始。使用数组的 push 方法而不是向其中添加元素。 jsfiddle.net/KUfcf
    • 谢谢,已修复(实际上在评论之前)。 push 比直接赋值稍慢,所以(在这种情况下)我认为最好使用 [i]
    • 您提供的解决方案完美运行。谢谢
    • @Eric 我不会这么说,而是说不需要产生均匀随机的排列。但是感谢您的评论,尤其是链接;编辑答案以包含真正的排序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多