产生范围内唯一的编号(0 - X),保持历史prevent重复 [英] Generate unique number within range (0 - X), keeping a history to prevent duplicates

查看:117
本文介绍了产生范围内唯一的编号(0 - X),保持历史prevent重复的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我遇到了,我需要从返回给定范围内的随机数的函数挑战0 - X 。不仅如此,但我需要返回的数字为唯一;没有复制一个已经在previous调用该函数返回的数字。

I ran into the challenge where I need a function that returns a random number within a given range from 0 - X. Not only that, but I require the number returned to be unique; not duplicating numbers that have already been returned on previous calls to the function.

任选地,当这样做(例如,范围已被用尽),只是范围内返回一个随机数。

Optionally, when this is done (e.g. the range has been 'exhausted'), just return a random number within the range.

如何将一个去这样做呢?

How would one go about doing this?

推荐答案

我写了这个功能。它保持了自己的阵列生成的数字,preventing初始重复的历史,继续输出一个随机数,如果在范围内的所有数字已输出一次:

I wrote this function. It keeps its own array with a history of generated numbers, preventing initial duplicates, continuing to output a random number if all numbers in the range have been outputted once:

// 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;
        }
    }
};

这里的工作小提琴

我希望这是使用的人!

编辑:由尖尖指出下面时,它可能会以缓慢的大范围(这里是一个
小提琴,会在一个范围0-1000 ,这似乎运行正常)。然而;我并不需要一个非常大的范围内,所以也许这个功能确实不适合,如果你看看生成和保持一个巨大的范围内跟踪。

as pointed out by Pointy below, it might get slow with a large range (here is a fiddle, going over a range from 0-1000, which seems to run fine). However; I didn't require a very large range, so perhaps this function is indeed not suited if you look to generate and keep track of an enormous range.

这篇关于产生范围内唯一的编号(0 - X),保持历史prevent重复的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆