Функция рандома с исключением
Подскажите пожалуйста, может кто то знает. Нужна функция которая выдает случайное целое число в определенном диапазоне за исключением одного или нескольких чисел из этого диапазона
|
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, время: 07:48. |