Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.12.2014, 23:47
Профессор
Отправить личное сообщение для wadim Посмотреть профиль Найти все сообщения от wadim
 
Регистрация: 20.01.2014
Сообщений: 150

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

Пробовал так

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

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

возможно и ваш другой вариант кода посмотреть
Ответить с цитированием
  #2 (permalink)  
Старый 03.12.2014, 23:51
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

wadim,
Это невозможно реализовать эффективно. Тебе после каждой генерации числа придется проверять его на повторяемость. Имхо, проще генерировать последоватльность, а затем делать рандомную выборку, с деструкцией. Но это вс нетривиальные алгоритмы.
Ответить с цитированием
  #3 (permalink)  
Старый 03.12.2014, 23:57
Профессор
Отправить личное сообщение для wadim Посмотреть профиль Найти все сообщения от wadim
 
Регистрация: 20.01.2014
Сообщений: 150

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

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

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

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

Последний раз редактировалось wadim, 04.12.2014 в 00:03.
Ответить с цитированием
  #4 (permalink)  
Старый 04.12.2014, 00:17
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

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

Последний раз редактировалось krutoy, 04.12.2014 в 00:24.
Ответить с цитированием
  #5 (permalink)  
Старый 04.12.2014, 00:21
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

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));
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #6 (permalink)  
Старый 04.12.2014, 00:26
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

wadim,
функция формирования массива с уникальными данными с заданной длиной и диапазоном
Ответить с цитированием
  #7 (permalink)  
Старый 04.12.2014, 00:50
Профессор
Отправить личное сообщение для wadim Посмотреть профиль Найти все сообщения от wadim
 
Регистрация: 20.01.2014
Сообщений: 150

Всем спасибо, отдельно krutoy. krutoy Ваш вариант то что нужно.
Ответить с цитированием
  #8 (permalink)  
Старый 04.12.2014, 00:57
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

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 ]

Если это важно.
Я потестил, вроде работает. Не силен я в математике
Ответить с цитированием
  #9 (permalink)  
Старый 04.12.2014, 01:15
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

krutoy,
0 и 19 будут выпадать реже в 2 раза чем любое другое число
Ответить с цитированием
  #10 (permalink)  
Старый 04.12.2014, 01:18
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

Math.floor(Math.random()*20)
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массив как ссылочный тип Gerald Общие вопросы Javascript 2 20.12.2013 12:07
Как сформировать массив из формы по выбору checkbox? Surlik jQuery 3 08.11.2013 11:53
Как передать массив из PHP в js (AJAX) Александр Иванов Общие вопросы Javascript 7 10.09.2009 10:22
Как лучше сделать глобальный массив skyfish AJAX и COMET 4 17.02.2009 18:05
Как передать массив? remitmaster Общие вопросы Javascript 6 17.09.2008 12:47