06.06.2014, 02:26
|
Аспирант
|
|
Регистрация: 03.12.2013
Сообщений: 35
|
|
массив со случайными числами
Помогите создать массив c четырьмя числами. Одно число известное, три случайных в пределах от 0 до n. Ни одно из трех случайных чисел не должно быть равно известному.
И порядок всех четырех чисел в массиве должен быть случайным.
p.s. Ни одно число в массиве не должно повторятся
Последний раз редактировалось optron, 06.06.2014 в 03:31.
|
|
06.06.2014, 03:20
|
|
Тлен
|
|
Регистрация: 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
|
|
06.06.2014, 03:31
|
Аспирант
|
|
Регистрация: 03.12.2013
Сообщений: 35
|
|
спасибо
Работает но я еще забыл упомянуть что ни одно число не должно повторяться
|
|
06.06.2014, 03:45
|
Профессор
|
|
Регистрация: 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);
|
|
06.06.2014, 04:38
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,590
|
|
jsnb, ужасно, даже чудовищно. Так делать нельзя никогда.
Конечно на конкретной задаче с массивом из 4 чисел вся мерзость заметна не будет, но за такой код я бы клаву об голову разбил, да.
__________________
29375, 35
Последний раз редактировалось Aetae, 06.06.2014 в 04:40.
|
|
06.06.2014, 04:58
|
Профессор
|
|
Регистрация: 15.03.2014
Сообщений: 561
|
|
Сообщение от Aetae
|
jsnb, ужасно, даже чудовищно. Так делать нельзя никогда.
Конечно на конкретной задаче с массивом из 4 чисел вся мерзость заметна не будет, но за такой код я бы клаву об голову разбил, да.
|
Так а как еще гарантировано обеспечить уникальность чисел в массиве, если не сравнивать с уже существующими элементами? Или ужас-ужас в сортировке?
|
|
06.06.2014, 05:20
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,590
|
|
И в сортировке - ибо она псевдорандомна и не даёт нормального распределения, и в потенциальном вечном(очень долгом) цикле бессмысленного брутфорса.
Как? Ответ в моём решении например, если его расширить.
__________________
29375, 35
|
|
06.06.2014, 05:36
|
Профессор
|
|
Регистрация: 15.03.2014
Сообщений: 561
|
|
Сообщение от Aetae
|
Как? Ответ в моём решении например, если его расширить.
|
А подробнее про расширение можно? А то я что-то не могу понять как при таком подходе обеспечивать случайность, уникальность и при это не выходить за границы указанного диапазона.
|
|
06.06.2014, 05:45
|
|
Тлен
|
|
Регистрация: 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.
|
|
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))
|
|
|
|