массив со случайными числами
Помогите создать массив c четырьмя числами. Одно число известное, три случайных в пределах от 0 до n. Ни одно из трех случайных чисел не должно быть равно известному.
И порядок всех четырех чисел в массиве должен быть случайным. p.s. Ни одно число в массиве не должно повторятся |
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)) |
спасибо
Работает но я еще забыл упомянуть что ни одно число не должно повторяться |
Цитата:
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); |
jsnb, ужасно, даже чудовищно. Так делать нельзя никогда.
Конечно на конкретной задаче с массивом из 4 чисел вся мерзость заметна не будет, но за такой код я бы клаву об голову разбил, да. |
Цитата:
|
И в сортировке - ибо она псевдорандомна и не даёт нормального распределения, и в потенциальном вечном(очень долгом) цикле бессмысленного брутфорса.
Как? Ответ в моём решении например, если его расширить. |
Цитата:
|
Вот функция:
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; } Генерирует массив не повторяющихся рандомных чисел из заданного диапазона заданной длины. Кое что ещё можно пооптимизировать, но суть должна быть понятна. |
:write:
ещё вариант ... без проверки входных данных 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)) |
Часовой пояс GMT +3, время: 07:13. |