Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Скрипт для генерации числа (https://javascript.ru/forum/misc/71309-skript-dlya-generacii-chisla.html)

УмкаДима 09.11.2017 13:24

Скрипт для генерации числа
 
Добрый день. Помогите написать скрипт для генерации одного числа, которое не повторяется при повторной генерации.

Alexandroppolus 09.11.2017 13:27

Если любое число:
var getNumber = (function() {
  var n = 0;
  return function() { return ++n; };
})();


Если случайное, то надо запоминать какие уже были.

Nexus 09.11.2017 13:28

function get_uniqu_id(){
    return (new Date()).getTime()+Math.random();
}
alert(get_uniqu_id());

ruslan_mart 09.11.2017 13:30

var getUniqRandomInt = (function() {

    var numbers = [];

    return function fn(max) {
        var n = Math.floor(Math.random() * (max - min + 1)) + min;

        if(numbers.indexOf(n) !== -1) {
              n = fn(max);
        }

        numbers.push(n);

        return n;
    };
})();

УмкаДима 09.11.2017 13:32

Спасибо

Rasy 09.11.2017 13:46

ruslan_mart,
Сниппет? Код нужно поправить:)

ruslan_mart 09.11.2017 21:08

Rasy, да, в торопяк писал. Я тут получше решение придумал:

var getUniqueRandomInt = (function() {

	var DEFAULT_MAX = Number.MAX_VALUE;
	var DEFAULT_MIN = 0;

	var cacheValues = [];

	function getRandomInt(min, max) {
		var value = Math.floor(Math.random() * (max - min + 1)) + min;

		return cacheValues.indexOf(value) !== -1 ? getRandomInt(min, max) : value;
	}

	return function() {
		var range = Array.prototype.slice.call(arguments).sort();

		if(range.length < 2) {
			range.unshift(DEFAULT_MIN);

			if(range.length < 2) {
				range.push(DEFAULT_MAX);
			}
		}
		
		try {
			var value = getRandomInt.apply(null, range);
			cacheValues.push(value);
			return value;
		}
		catch(exp) {
			return NaN;
		}
	};

})();


console.log(getUniqueRandomInt(1, 3)); //1-3
console.log(getUniqueRandomInt(3, 2)); //2-3
console.log(getUniqueRandomInt(3)); //0-3
console.log(getUniqueRandomInt(0, 3)); // 0-3
console.log(getUniqueRandomInt(3)); //NaN

рони 09.11.2017 21:19

ruslan_mart,
сортировка зачем?

Alexandroppolus 09.11.2017 21:26

любопытный вариант )
у меня в Хроме глубина вызовов до переполнения стека оказалась всего 8952.

соответственно, на интервале, скажем, (1...100000) наны начнут выскакивать задолго до исчерпания интервала :)

ruslan_mart 10.11.2017 08:30

рони, если вдруг передашь сначала max, а потом - min. :)

getUniqueRandomInt(10, 3); //3-10


Alexandroppolus, тогда даже не знаю, какой способ тут можно придумать. С одной стороны, вряд ли кому-либо нужно будет генерировать столько случайных чисел, а с другой... надо подумать как лучше это организовать. :write:


Часовой пояс GMT +3, время: 07:00.