Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.06.2014, 02:26
Аспирант
Отправить личное сообщение для optron Посмотреть профиль Найти все сообщения от optron
 
Регистрация: 03.12.2013
Сообщений: 35

массив со случайными числами
Помогите создать массив c четырьмя числами. Одно число известное, три случайных в пределах от 0 до n. Ни одно из трех случайных чисел не должно быть равно известному.
И порядок всех четырех чисел в массиве должен быть случайным.

p.s. Ни одно число в массиве не должно повторятся

Последний раз редактировалось optron, 06.06.2014 в 03:31.
Ответить с цитированием
  #2 (permalink)  
Старый 06.06.2014, 03:20
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

function rand(val,max){
    var arr = [], 
        i = 3, 
        pos = Math.floor(Math.random()*(i+1));
    while(i--){
        var rnd = Math.floor(Math.random()*max);
        arr.push(rnd >= val ? ++rnd : rnd);
    }
    arr.splice(pos,0,val);
    return arr
}

alert(rand(3,5))
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 06.06.2014, 03:31
Аспирант
Отправить личное сообщение для optron Посмотреть профиль Найти все сообщения от optron
 
Регистрация: 03.12.2013
Сообщений: 35

спасибо
Работает но я еще забыл упомянуть что ни одно число не должно повторяться
Ответить с цитированием
  #4 (permalink)  
Старый 06.06.2014, 03:45
Профессор
Отправить личное сообщение для jsnb Посмотреть профиль Найти все сообщения от jsnb
 
Регистрация: 15.03.2014
Сообщений: 561

Сообщение от optron Посмотреть сообщение
но я еще забыл упомянуть что ни одно число не должно повторяться
var num = 5;
var arr = [num];
var n = 10;
for(var i = 0; i < 3; i++) {
  do {
    var randNum = Math.round( -0.5 + Math.random()*(n+1) );
  } while( arr.indexOf(randNum) !== -1);
  arr.push(randNum);
}
arr.sort(function(){ return Math.random()-0.5 });
alert(arr);
Ответить с цитированием
  #5 (permalink)  
Старый 06.06.2014, 04:38
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

jsnb, ужасно, даже чудовищно. Так делать нельзя никогда.

Конечно на конкретной задаче с массивом из 4 чисел вся мерзость заметна не будет, но за такой код я бы клаву об голову разбил, да.
__________________
29375, 35

Последний раз редактировалось Aetae, 06.06.2014 в 04:40.
Ответить с цитированием
  #6 (permalink)  
Старый 06.06.2014, 04:58
Профессор
Отправить личное сообщение для jsnb Посмотреть профиль Найти все сообщения от jsnb
 
Регистрация: 15.03.2014
Сообщений: 561

Сообщение от Aetae Посмотреть сообщение
jsnb, ужасно, даже чудовищно. Так делать нельзя никогда.

Конечно на конкретной задаче с массивом из 4 чисел вся мерзость заметна не будет, но за такой код я бы клаву об голову разбил, да.
Так а как еще гарантировано обеспечить уникальность чисел в массиве, если не сравнивать с уже существующими элементами? Или ужас-ужас в сортировке?
Ответить с цитированием
  #7 (permalink)  
Старый 06.06.2014, 05:20
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

И в сортировке - ибо она псевдорандомна и не даёт нормального распределения, и в потенциальном вечном(очень долгом) цикле бессмысленного брутфорса.
Как? Ответ в моём решении например, если его расширить.
__________________
29375, 35
Ответить с цитированием
  #8 (permalink)  
Старый 06.06.2014, 05:36
Профессор
Отправить личное сообщение для jsnb Посмотреть профиль Найти все сообщения от jsnb
 
Регистрация: 15.03.2014
Сообщений: 561

Сообщение от Aetae Посмотреть сообщение
Как? Ответ в моём решении например, если его расширить.
А подробнее про расширение можно? А то я что-то не могу понять как при таком подходе обеспечивать случайность, уникальность и при это не выходить за границы указанного диапазона.
Ответить с цитированием
  #9 (permalink)  
Старый 06.06.2014, 05:45
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

Вот функция:
function rand(max, min, length){
	var result = [],
		resultSorted = [];

	if(typeof max !== 'number') return Math.random();
	if(typeof min !== 'number') return Math.floor(Math.random() * ++max);

	if(min > max) min = [max, max = min][0];                 

	if(!length || typeof length !== 'number') return Math.floor(Math.random() * (max - min + 1)) + min;

	if(length > max - min + 1) throw new RangeError('invalid length.');

	for(var j = 0, random, index; j < length; j++, max--){
		random = Math.floor(Math.random() * (max - min + 1)) + min;

		for(index = j; index && resultSorted[index-1] <= random; index--) random++; 

		result.push(random);
		resultSorted.splice(index, 0, random);
	}

	return result;
}

Генерирует массив не повторяющихся рандомных чисел из заданного диапазона заданной длины. Кое что ещё можно пооптимизировать, но суть должна быть понятна.
__________________
29375, 35

Последний раз редактировалось Aetae, 06.06.2014 в 05:51.
Ответить с цитированием
  #10 (permalink)  
Старый 06.06.2014, 10:07
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126


ещё вариант ... без проверки входных данных
function rand(val, min, max, length) {
        var obj = {}, arr = [val];
        obj[val] = true;
        length--;
        while (length) {
            var rnd = Math.floor(Math.random() * (max - min + 1)) + min;
            if (!obj[rnd]) {
                obj[rnd] = true;
                length--;
                arr[Math.random() > .5 ? 'push' : 'unshift'](rnd)
            };
        }

        return arr
    }

    alert(rand(3, 7, 12, 4))
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как в шаблоне диррективы узнать массив это или строка? delias Angular.js 1 18.03.2014 07:33
Отправить, когда четко соберется массив vas88811 Events/DOM/Window 11 26.02.2014 21:55
Массив объектов doox911 Библиотеки/Тулкиты/Фреймворки 6 16.01.2014 22:36
Как создать многомерный массив FRIE Общие вопросы Javascript 29 02.06.2010 19:14
Подскажите, как вернуть js-скрипт массив Polkan AJAX и COMET 18 30.04.2010 23:30