Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как заполнить массив не повторяющимися случайными числами? (https://javascript.ru/forum/misc/52097-kak-zapolnit-massiv-ne-povtoryayushhimisya-sluchajjnymi-chislami.html)

wadim 03.12.2014 23:47

Как заполнить массив не повторяющимися случайными числами?
 
Как заполнить массив не повторяющимися случайными числами?

Пробовал так

<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:"

просьба не отвечать типа а это что, это куда, запустите этот готовый код, и посмотри что выдает, если сообразите как до ума довести - пишите, спасибо.

возможно и ваш другой вариант кода посмотреть

krutoy 03.12.2014 23:51

wadim,
Это невозможно реализовать эффективно. Тебе после каждой генерации числа придется проверять его на повторяемость. Имхо, проще генерировать последоватльность, а затем делать рандомную выборку, с деструкцией. Но это вс нетривиальные алгоритмы.

wadim 03.12.2014 23:57

Да мне эффективность не нужна, массив должен быть 4 элемента каждый элемент принимает значения от 0 до 19. к примеру arr[0,2,3,19]

krutoy, мысль ваша понятна, но не до конца, имеем

можно в ручную без лишнего сделать массив
qq= Array(0,1,2,3,4 ... 19);

А как далее? Как сделать рандомную выборку?

krutoy 04.12.2014 00:17

Не знаю, как безкостыльно сделать реализацию рандома до 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 ]

nerv_ 04.12.2014 00:21

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));

рони 04.12.2014 00:26

wadim,
функция формирования массива с уникальными данными с заданной длиной и диапазоном

wadim 04.12.2014 00:50

Всем спасибо, отдельно krutoy. krutoy Ваш вариант то что нужно.

krutoy 04.12.2014 00:57

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 ]

Если это важно.
Я потестил, вроде работает. Не силен я в математике:)

рони 04.12.2014 01:15

krutoy,
0 и 19 будут выпадать реже в 2 раза чем любое другое число

рони 04.12.2014 01:18

:write: Math.floor(Math.random()*20)


Часовой пояс GMT +3, время: 01:58.