27.09.2016, 23:06
|
Новичок на форуме
|
|
Регистрация: 27.07.2016
Сообщений: 8
|
|
Функция рандома с исключением
Подскажите пожалуйста, может кто то знает. Нужна функция которая выдает случайное целое число в определенном диапазоне за исключением одного или нескольких чисел из этого диапазона
|
|
28.09.2016, 00:01
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,126
|
|
miusov,
а причём тут jQuery и велик ли диапазон?
|
|
28.09.2016, 01:36
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,590
|
|
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, на всякий случай.)
__________________
29375, 35
|
|
28.09.2016, 03:16
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,126
|
|
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)
}
|
|
28.09.2016, 03:42
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,590
|
|
рони, ага, плохочитаемого минимализма, выполняющегося в сто раз медленнее.)
Завязывай ты с es6, чувак, это тяжёлая хрень.
__________________
29375, 35
|
|
28.09.2016, 10:44
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,126
|
|
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>
|
|
28.09.2016, 18:35
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,590
|
|
рони, "но зачем"©
Единственное что реально стоит соптимизировать:
while(i--) if(result >= exclude[i]) result++;
->
while(result >= exclude[--i]) result++;
, но тогда нужда в проверках входных данных возрастёт, ибо тут косяк приведёт уже не к неверным значениям, а к вечному циклу.)
Впрочем на разумных цифрах это вообще всё фигня в плане скорости выполнения, и думать тут не о чем, можно юзать любую версию. Но твои хаки с приведением булева значения к числу - явно не то что стоит использовать.)
__________________
29375, 35
|
|
|
|