【问题标题】:Random set of non-repeating numbers in JavascriptJavascript中的随机非重复数字集
【发布时间】:2013-05-19 16:12:52
【问题描述】:

我有一个烦人的脚本无法完成。

我需要 0-64 个可能的数字集中的 32 个非重复数字。每次我尝试创建一个循环来对照数组中的所有数字检查新的随机数时,我最终什么都没有,或者是一个无限循环。

我被难住了:(

【问题讨论】:

标签: javascript loops random


【解决方案1】:

此代码将生成一个介于 0 和您给它的任何数字之间的非重复随机数,当它被称为您给它的数字量时,它将重新开始。

试一试:

let randomNumber = function (max) {
    let min = 0, prevIndexes = [];
    function exec(max2) {
        max = max || max2;
        let result = Math.floor(Math.random() * (max - min + 1) + min);
        if (prevIndexes) {
            if (prevIndexes.length - 1 === max) {
                clear();
            }
            let foundDouble, eqPrevInn = true;
            while (eqPrevInn) {
                foundDouble = false;
                result = Math.floor(Math.random() * (max - min + 1) + min);
                for (let i = 0, l = prevIndexes.length; i < l; i++) {
                    if (result === prevIndexes[i]) {
                        foundDouble = true;
                        break;
                    }
                }
                if (!foundDouble) {
                    eqPrevInn = false;
                }
            }
        }
        prevIndexes.push(result);
        console.log(prevIndexes);
        return result;

    }

    let clear = function () {
        if (prevIndexes) {
            prevIndexes = [];
            //             console.log('prevIndexes has been cleared');
        }
        else {
            //             console.log('already clear');
        }
    }
    return {
        exec: exec,
        clear: clear
    }
};

let random32 = randomNumber(32/*range*/).exec;

for (let i = 0; i <= 32; i++) {
    random32();
}

【讨论】:

    【解决方案2】:

    试试这个:

    var keys = [], numbers = [], x, total = 0;
    while(total < 32) {
        x = Math.floor(Math.random() * 64);
        // way faster that looping through the array to check if it exists
        if(keys[x] == undefined) { 
            keys[x] = 1;
            numbers.push(x);
            total++;
        }
    }
    console.log(numbers);
    

    Working Demo

    【讨论】:

    • 这永远不会返回 64 但它会返回 0。数学随机是 0 包含到 1 不包含 - developer.mozilla.org/en-US/docs/JavaScript/Reference/… - 该页面也有关于如何在 x 和 y 之间实现随机 int 的好建议跨度>
    • 谢谢,很接近,但数组中的所有数字都是连续的。有没有快速随机化它们的方法?
    • @PeterAjtai - OP 特别需要 0 到 64 之间的数字。因此需要发言。
    • @flyagaricus - 为此,您可以直接使用stackoverflow.com/questions/2450954/…
    • @PeterAjtai - 你是对的。这将永远不会返回 64。答案已更正。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 2012-01-20
    • 2020-10-18
    • 1970-01-01
    相关资源
    最近更新 更多