在遇到挑战时,我需要一个函数,该函数返回从到给定范围内的随机数0 - X。不仅如此,我还要求返回的数字必须 唯一 ;不重复在先前对该函数的调用中已返回的数字。
0 - X
(可选)完成此操作后(例如,范围已“用尽”),只需返回该范围内的随机数即可。
人们将如何去做呢?
我写了这个功能。它使用生成的数字的历史记录保留其自己的数组,防止初始重复,如果范围内的所有数字均已输出一次,则继续输出随机数:
// 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的范围内运行,似乎运行良好)。然而我并不需要很大的范围,所以如果您希望生成并跟踪很大的范围,则此功能可能确实不适合。