Функция рандома с исключением
Подскажите пожалуйста, может кто то знает. Нужна функция которая выдает случайное целое число в определенном диапазоне за исключением одного или нескольких чисел из этого диапазона
|
miusov,
а причём тут jQuery и велик ли диапазон? |
function rand(min, max){ var exclude = Array.prototype.slice.call(arguments, 2).sort(function(a,b){return b-a}), i = exclude.length; max = max + 1 - min - i; var result = Math.floor(Math.random()*max) + min; while(i--) if(result >= exclude[i]) result++; return result } rand(1, 4, 1, 2, 3) //4 Это если быть уверенным во входных данных, а так стоит добавить проверок и RangeError, на всякий случай.) |
Aetae,
:) тоже самое в стиле минимализма function rand(a, b, ...c) { b = b + 1 - a - c.length; b = Math.floor(Math.random() * b) + a; return c.sort((a, b) => a - b).reduce((c, b) => c += c >= b, b) } |
рони, ага, плохочитаемого минимализма, выполняющегося в сто раз медленнее.)
Завязывай ты с es6, чувак, это тяжёлая хрень. |
:) es6 => es5
<script> function rand(min, max) { for (var exclude = [], i = 2; i < arguments.length; ++i) exclude[i - 2] = arguments[i]; max += 1 - min - exclude.length; var result = min +(Math.random() * max)|0; return exclude.sort(function(a, b) { return a - b }).reduce(function(result, value) { return result + (result >= value) }, result) }; for (var i=0; i<50; i++) {document.write(rand(1, 8, 1, 3, 5, 7)+", ")} </script> |
рони, "но зачем"©
Единственное что реально стоит соптимизировать: while(i--) if(result >= exclude[i]) result++;-> while(result >= exclude[--i]) result++;, но тогда нужда в проверках входных данных возрастёт, ибо тут косяк приведёт уже не к неверным значениям, а к вечному циклу.) Впрочем на разумных цифрах это вообще всё фигня в плане скорости выполнения, и думать тут не о чем, можно юзать любую версию. Но твои хаки с приведением булева значения к числу - явно не то что стоит использовать.) |
Часовой пояс GMT +3, время: 12:56. |