Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 27.09.2016, 23:06
Новичок на форуме
Отправить личное сообщение для miusov Посмотреть профиль Найти все сообщения от miusov
 
Регистрация: 27.07.2016
Сообщений: 8

Функция рандома с исключением
Подскажите пожалуйста, может кто то знает. Нужна функция которая выдает случайное целое число в определенном диапазоне за исключением одного или нескольких чисел из этого диапазона
Ответить с цитированием
  #2 (permalink)  
Старый 28.09.2016, 00:01
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

miusov,
а причём тут jQuery и велик ли диапазон?
Ответить с цитированием
  #3 (permalink)  
Старый 28.09.2016, 01:36
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,480

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
Ответить с цитированием
  #4 (permalink)  
Старый 28.09.2016, 03:16
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

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)
}
Ответить с цитированием
  #5 (permalink)  
Старый 28.09.2016, 03:42
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,480

рони, ага, плохочитаемого минимализма, выполняющегося в сто раз медленнее.)
Завязывай ты с es6, чувак, это тяжёлая хрень.
__________________
29375, 35
Ответить с цитированием
  #6 (permalink)  
Старый 28.09.2016, 10:44
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

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>
Ответить с цитированием
  #7 (permalink)  
Старый 28.09.2016, 18:35
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,480

рони, "но зачем"©
Единственное что реально стоит соптимизировать:
while(i--) if(result >= exclude[i]) result++;
->
while(result >= exclude[--i]) result++;
, но тогда нужда в проверках входных данных возрастёт, ибо тут косяк приведёт уже не к неверным значениям, а к вечному циклу.)

Впрочем на разумных цифрах это вообще всё фигня в плане скорости выполнения, и думать тут не о чем, можно юзать любую версию. Но твои хаки с приведением булева значения к числу - явно не то что стоит использовать.)
__________________
29375, 35
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
js рекурсивная функция с for.. in циклом frying Общие вопросы Javascript 6 25.08.2014 10:50
не вызывается функция при изменении option soft4you Общие вопросы Javascript 1 23.07.2014 17:41
AJAX функция для новых html-элементов broadcast77 AJAX и COMET 25 03.03.2014 14:01
функция и несуществующий id Ankh Элементы интерфейса 4 10.02.2012 23:49
функция не успевает Sadist_dead Элементы интерфейса 22 02.10.2011 19:00