一尘不染

生成(0-X)范围内的唯一编号,并保留历史记录以防止重复

javascript

在遇到挑战时,我需要一个函数,该函数返回从到给定范围内的随机数0 - X。不仅如此,我还要求返回的数字必须 唯一
;不重复在先前对该函数的调用中已返回的数字。

(可选)完成此操作后(例如,范围已“用尽”),只需返回该范围内的随机数即可。

人们将如何去做呢?


阅读 240

收藏
2020-05-01

共1个答案

一尘不染

我写了这个功能。它使用生成的数字的历史记录保留其自己的数组,防止初始重复,如果范围内的所有数字均已输出一次,则继续输出随机数:

// Generates a unique number from a range
// keeps track of generated numbers in a history array
// if all numbers in the range have been returned once, keep outputting random numbers within the range
var UniqueRandom = { NumHistory: new Array(), generate: function(maxNum) {
        var current = Math.round(Math.random()*(maxNum-1));
        if (maxNum > 1 && this.NumHistory.length > 0) {
            if (this.NumHistory.length != maxNum) {
                while($.inArray(current, this.NumHistory) != -1) { current = Math.round(Math.random()*(maxNum-1)); }
                this.NumHistory.push(current);
                return current;
            } else {
                //unique numbers done, continue outputting random numbers, or we could reset the history array (NumHistory = [];)
                return current;
            }
        } else {
            //first time only
            this.NumHistory.push(current);
            return current;
        }
    }
};

我希望这对某人有用!

编辑:正如下面的Pointy所指出的,它在大范围内可能会变慢,在0-1000的范围内运行,似乎运行良好)。然而我并不需要很大的范围,所以如果您希望生成并跟踪很大的范围,则此功能可能确实不适合。

2020-05-01