Как заполнить массив не повторяющимися случайными числами?
Как заполнить массив не повторяющимися случайными числами?
Пробовал так <script> ArrRandomX= Array(0,1); RandomX= Math.round(Math.random()*2); top: for (i=0; i<ArrRandomX.length; i++) if (ArrRandomX[i] == RandomX) { RandomX = Math.round(Math.random()*2); break top; } ArrRandomX[ArrRandomX.length]= RandomX; alert(ArrRandomX); </script> не работает, выдает 0,1,0 и подобное, а надо 0,1,2. Вообще от break не могу разобраться работоспособности, только break 2; у меня работает, а надо переход к "top:" просьба не отвечать типа а это что, это куда, запустите этот готовый код, и посмотри что выдает, если сообразите как до ума довести - пишите, спасибо. возможно и ваш другой вариант кода посмотреть |
wadim,
Это невозможно реализовать эффективно. Тебе после каждой генерации числа придется проверять его на повторяемость. Имхо, проще генерировать последоватльность, а затем делать рандомную выборку, с деструкцией. Но это вс нетривиальные алгоритмы. |
Да мне эффективность не нужна, массив должен быть 4 элемента каждый элемент принимает значения от 0 до 19. к примеру arr[0,2,3,19]
krutoy, мысль ваша понятна, но не до конца, имеем можно в ручную без лишнего сделать массив qq= Array(0,1,2,3,4 ... 19); А как далее? Как сделать рандомную выборку? |
Не знаю, как безкостыльно сделать реализацию рандома до 19:), ну х с ней, пусть будет так, допустим
gen=function(){var val= Math.round(Math.random()*20); if(val===20) return val-1; return val} arr=[] inArr=function(val){ for(var i=0; i<=arr.length; i++) {if(arr[i]===val) return true} } while(arr.length<4){ tmp=gen() if(inArr(tmp)) continue; arr.push(tmp) } alert(arr) // [ 9, 5, 2, 10 ] // // [ 18, 12, 6, 7 ] // // [ 14, 13, 18, 4 ] // // [ 6, 7, 19, 3 ] // // [ 13, 5, 16, 3 ] // // [ 6, 2, 16, 1 ] // // [ 15, 14, 3, 19 ] // // [ 11, 13, 19, 16 ] // // [ 1, 15, 2, 18 ] // // [ 15, 14, 10, 19 ] // // [ 6, 12, 5, 10 ] // // [ 15, 6, 16, 13 ] // // [ 3, 11, 15, 18 ] // // [ 10, 4, 9, 17 ] // // [ 14, 12, 4, 7 ] // // [ 15, 7, 18, 14 ] // // [ 11, 6, 14, 15 ] // // [ 9, 7, 4, 12 ] // // [ 0, 19, 16, 13 ] // // [ 7, 13, 16, 3 ] |
var range = [1, 2, 3, 4, 5, 6, 7, 8, 9]; var stack = []; while(range.length) { var index = Math.random() * range.length >> 0; var item = range.splice(index, 1)[0]; stack.push(item); } alert(JSON.stringify(stack)); |
|
Всем спасибо, отдельно krutoy. krutoy Ваш вариант то что нужно.
|
wadim,
Только в моем варианте рандом кривовато сделан:) Там 19 будет повторяться чаще, наверное. Я не уверен, но попробуй вот такой гнератор gen=function(){return Math.round(Math.random()*19)} arr=[] inArr=function(val){ for(var i=0; i<=arr.length; i++) {if(arr[i]===val) return true} } while(arr.length<4){ tmp=gen() if(inArr(tmp)) continue; arr.push(tmp) } alert(arr) // ::: [ 0, 17, 7, 6 ] // ::: // ::: [ 4, 5, 16, 7 ] // ::: // ::: [ 5, 19, 7, 2 ] // ::: // ::: [ 14, 17, 9, 12 ] // ::: // ::: [ 14, 11, 12, 5 ] // ::: // ::: [ 16, 11, 7, 10 ] // ::: // ::: [ 6, 8, 14, 13 ] // ::: // ::: [ 16, 1, 12, 11 ] // ::: // ::: [ 18, 10, 16, 19 ] // ::: // ::: [ 11, 14, 10, 6 ] // ::: // ::: [ 14, 8, 17, 16 ] // ::: // ::: [ 13, 10, 2, 17 ] // ::: // ::: [ 9, 17, 13, 2 ] // ::: // ::: [ 11, 1, 0, 7 ] // ::: // ::: [ 15, 18, 9, 10 ] // ::: // ::: [ 17, 8, 13, 18 ] // ::: // ::: [ 12, 6, 15, 5 ] // ::: // ::: [ 6, 5, 16, 13 ] // ::: // ::: [ 3, 18, 14, 1 ] // ::: // ::: [ 10, 12, 7, 1 ] // ::: // ::: [ 7, 0, 13, 12 ] // ::: // ::: [ 17, 12, 10, 4 ] // ::: // ::: [ 12, 2, 14, 16 ] // ::: // ::: [ 16, 0, 13, 15 ] // ::: // ::: [ 10, 9, 0, 16 ] // ::: // ::: [ 12, 16, 8, 5 ] // ::: // ::: [ 14, 2, 3, 12 ] // ::: // ::: [ 14, 10, 6, 18 ] // ::: // ::: [ 8, 0, 7, 11 ] // ::: // ::: [ 18, 17, 13, 2 ] // ::: // ::: [ 4, 15, 16, 9 ] // ::: // ::: [ 18, 5, 17, 10 ] // ::: // ::: [ 11, 19, 10, 2 ] // ::: // ::: [ 2, 12, 6, 1 ] // ::: // ::: [ 2, 16, 18, 4 ] // ::: // ::: [ 13, 9, 17, 7 ] // ::: // ::: [ 15, 7, 10, 12 ] // ::: // ::: [ 2, 7, 3, 4 ] // ::: // ::: [ 9, 6, 10, 4 ] // ::: // ::: [ 18, 4, 16, 14 ] // ::: // ::: [ 7, 18, 6, 13 ] // ::: // ::: [ 17, 10, 1, 0 ] // ::: // ::: [ 11, 14, 17, 3 ] // ::: // ::: [ 5, 16, 2, 19 ] // ::: // ::: [ 14, 3, 12, 5 ] // ::: // ::: [ 1, 8, 10, 14 ] // ::: // ::: [ 8, 17, 1, 13 ] // ::: // ::: [ 19, 1, 11, 18 ] // ::: // ::: [ 18, 10, 14, 11 ] // ::: // ::: [ 13, 19, 1, 17 ] // ::: // ::: [ 12, 3, 9, 5 ] Если это важно. Я потестил, вроде работает. Не силен я в математике:) |
krutoy,
0 и 19 будут выпадать реже в 2 раза чем любое другое число |
:write: Math.floor(Math.random()*20)
|
Часовой пояс GMT +3, время: 22:40. |