Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Цикл for(i=0;j=0...) (https://javascript.ru/forum/misc/26825-cikl-i%3D0%3Bj%3D0.html)

9xakep 23.03.2012 19:40

Цикл for(i=0;j=0...)
 
for(i=0,j=0;i<=33,j<=33;j++,i++) {
    var let = []
    alert(let[j]=i)
  }

Видел раньше что люди вставляли в цикл множество переменных, почему данный код не работает?

9xakep 23.03.2012 19:42

Все...надо было ставить "," между i=0,j=0...
========================================
for(i=0;i<=33;i++) {
    var r = Math.floor(Math.random*10)
    r+=1
    var let = []
    let[i] = r
    alert(let[i])
  }

Почему не работает данный код? Точнее почему возвращает NaN?

9xakep 23.03.2012 20:06

1) Почему галочку поставить не можете?
2)
var r = Math.floor(Math.random()*10) // В смысле не вызываю? Вот же
alert(r)

9xakep 23.03.2012 20:08

Все, спасибо. После random скобки не поставил

monolithed 23.03.2012 20:26

Цитата:

Сообщение от 9xakep
После random скобки не поставил

alert(Math.random()*10
Цитата:

Сообщение от 9xakep
почему данный код не работает?

А что вы пытаетесь сделать?

9xakep 23.03.2012 20:49

На данный момент мне нужно сгенерировать 33 числа случайных числа, которые будут представлять из себя массив, можно просто создать 33 переменных, так было бы легче, но...уж больно быдлокод

nerv_ 23.03.2012 20:59

var arr = [], i = -1;

while( ++i < 33 ) {
	arr.push( Math.random() * 33 | 0 );
}

alert( arr.join( '\n' ) );

9xakep 23.03.2012 21:10

for(i=0;i<=33;i++) {
    var r = Math.floor(Math.random()*100)
    r+=getDay()
    let[i] = r
    }

Это-то я уже давно сделал) Но все равно спасибо. Мне сейчас надо их отсрочивать так, что бы они не повторялись

monolithed 23.03.2012 21:19

nerv_, не 9xakep хотел так:

for(var i = 0, count = 33, arr = []; i < count; i++, arr[i] = Math.random() * count | 0);
alert(arr.join( '\n' ));


:lol:

9xakep 23.03.2012 21:35

Зачем писать: 33 | 0?

monolithed 23.03.2012 21:47

Цитата:

Сообщение от 9xakep
Мне сейчас надо их отсрочивать так, что бы они не повторялись

var array = [], count = 33, i = -1;

while(++i < count) {
    array.push(Math.random() * count | 0);
}

array.sort(function(a, b) {
    return a-b;
});

i = array.length;

while (i--) {
	if (array[i] == array[i-1])
        array.splice(i, 1);
}

alert( array.join( '\n' ) );


Цитата:

Сообщение от 9xakep
Зачем писать: 33 | 0?

Эта операция транзитивна Math.floor();

9xakep 23.03.2012 22:06

monolithed,
Да хватит писать мне решения :-E
Тем более у вас какая то не случайность получается О_о Почти все последовательное...А начало как посл. фибоначи:11235..Но все равно интересный способ :D

monolithed 23.03.2012 22:15

Цитата:

Сообщение от 9xakep
Да хватит писать мне решения

А для чего нужно было создавать тему?
Цитата:

Сообщение от 9xakep
А начало как посл. фибоначи

Значения рандомны
Цитата:

Сообщение от 9xakep
Тем более у вас какая то не случайность получается О_о Почти все последовательное..

Так я отсортировал массив, а потом удалил дубликаты.

9xakep 23.03.2012 22:19

Цитата:

Сообщение от monolithed (Сообщение 164631)
А для чего нужно было создавать тему?

ну создавал я как бы по-другому впоросу, вы меня спросили что мне надо сделать, я ответил :stop:
Цитата:

Сообщение от monolithed (Сообщение 164631)
Так я отсортировал массив, а потом удалил дубликаты.

Если уж на то пошло, это не то

nerv_ 23.03.2012 22:36

Цитата:

Сообщение от monolithed
nerv_, не 9xakep хотел так:

я просто сразу не понял ;)
9xakep, вся проблема в том, что Вы не можете сформулировать задачу)

monolithed 23.03.2012 22:46

Цитата:

Сообщение от 9xakep
Если уж на то пошло, это не то

Цитата:

Сообщение от 9xakep
На данный момент мне нужно сгенерировать 33 числа случайных числа, которые будут представлять из себя массив

Сделано
Цитата:

Сообщение от 9xakep
Мне сейчас надо их отсрочивать так, что бы они не повторялись

Сделано
Если не нужна сортровка по возрастанию, то можно так:

var array = [1, 3, 1, 10, 1, 3, 4, 7, 30], i = array.length, result = [];

while(i--) {
    if(result.indexOf(array[i]) == -1) 
        result.push(array[i]);
}

alert(result);


PS: только, нужно позаботится о наличии indexOf или не заморачиваться и сделать так:
result.join().search(array[i]+'\\b') == -1

рони 24.03.2012 00:37

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

9xakep 24.03.2012 08:43

monolithed,
рони,
nerv_,
Thanks...но у меня свой вариант появляется :)

9xakep 24.03.2012 12:46

Maxmaxmахimus,
Так как, я:" неумелые прогарммисты, неряхи, или новички " то я в принципе не понял что ты сказал

9xakep 24.03.2012 13:11

<script>
var let = [1,2,3,4,1,5] 
alert(let)
for(k=0;k<=let.length;k++) { 
console.log('k: '+let[k]) 
  for(j=0;j<let.length;j++) {
    if(k==j) j+=1;
    if(let[k]==let[j]) {
      let[k] = Math.random() * 6 | 0
    } else { 
continue;
 }
  }
}
alert(let)
</script>

Та идея что пришла в голову почти осуществилась...но есть некоторые изъяны..Пока он только находит и заменяет повторяющееся число, но не факт что в результате повторения не будет..
Например:
[1,2,3,4,1,5]
[2,0,3,4,1,5] // заменил первую цифру на 2, проверил, что 2 уже есть, и заменил ее на 0
Но:
[1,2,3,4,1,5]
[4,2,3,4,1,5] // что в роде такого получилось как-то...4 все равно осталась

9xakep 24.03.2012 18:46

Все...сделал. Знаю что быдлокод явно выраженный, но идеи уже закончились...Читал рассказ про программиста: "приходишь домой и еще весь вечер недоумеваешь, как твой код может работать" У меня сейчас примерно тоже самое)
<script>
var let = []
for(i=0;i<33;i++) {
var r = Math.random() * 33 | 0
let[i] = r
}
alert(let)
var i = 100;
while(i>0) {
  for(k=0;k<=let.length;k++) { 
 
    for(j=0;j<let.length;j++) {
 
      if(k!=j) {
      if(let[k]==let[j]) {
 
        let[k] = Math.random() * 33 | 0
        for(a=0;a<j;a++) {
          if(let[a]==let[j]) {
            let[a] = Math.random() * 33 | 0
    	    }
          }
        } 
      }
    }
  }
--i
}
alert(let)
function ch() {
var c = 0
  for(aa=0;aa<=let.length;aa++) {
    for(b=0;b<let.length;b++) {
      if(aa!=b) {
        if(let[aa] == let[b]) {
          c+=1
        } else { 
          c+=0 
        }
   }
     }
}
alert(c)
}
ch()
</script>

P.S. если последний алерт возвращает 0, значит совпадений не найдено, если же другое число, то оно означает сколько найдено совпадений

monolithed 24.03.2012 18:54

9xakep, да сделай ты уже рекурсивную функцию

9xakep 24.03.2012 19:04

monolithed,
знать бы что это такое :D Ф-ия которая вызывает саму себя изнутри? Тогда все тот же вопрос ниже
=========
И зачем?

monolithed 24.03.2012 19:22

Цитата:

Сообщение от 9xakep
И зачем?

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

9xakep 24.03.2012 19:39

Цитата:

Сообщение от monolithed (Сообщение 164765)
перебирает элементы и заменят повторяющиеся на какое-то рандомное значение, до тех пор пока повторения не исчезнут.
+ нужно делать проверку перед вставкой элемента на его наличие в массиве.

Это собственно и было самое сложное...Ладно...завтра может попробую

9xakep 25.03.2012 22:07

Бугага)) Шифратор готов, monolithed, да-да, я ничего не переделал, но это в будущем
<input type='text' value='' id='text'>
<input type='button' value='шифровать' onclick='w()'>
<script>
var let = []
for(i=0;i<33;i++) {
var r = Math.random() * 33 | 0
let[i] = r
}
var i = 100;
while(i>0) {
  for(k=0;k<=let.length;k++) { 
    for(j=0;j<let.length;j++) {
      if(k!=j) {
      if(let[k]==let[j]) {
        let[k] = Math.random() * 33 | 0
        for(a=0;a<j;a++) {
          if(let[a]==let[j]) {
            let[a] = Math.random() * 33 | 0
    	    }
          }
        } 
      }
    }
  }
--i
}
let[33] = '_'
function w() {
var buk = ['А','Б','В','Г','Д','Е','Ё','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С','Т','У','Ф','Х','Ц','Ч','Ш','Щ','Ъ','Ы','Ь','Э','Ю','Я',' ']
var b = document.getElementById('text').value
var b = b.toUpperCase()
var b1 = b.match(/./g)
for(a=0;a<b1.length;a++) {
  for(b=0;b<=buk.length;b++) {
    if(b1[a]==buk[b]) {
      b1[a] = let[b];
      var b2 = ''+b2 + b1[a];
      var b3 = b2.replace(/undefined/, '')
      }  
  }
}
document.write(b3)
}
</script>

Как работает:
1) Генерирует 33 числа
2) Заносит в массив
3) Делает их не повторяемыми
4) Пишем строку
5) Создаем массив русских букв
6) "Связываем" букву в строке, с буквой массиве, заменяем букву на цифру. Делаем со всеми также...
P.S. это укороченный вариант :D Кому интересно копайтесь в коде :p
=============
Произошла накладка с пробелом...Заработает через минут 5

FINoM 26.03.2012 01:19

monolithed, по идее, циклы без тела работают быстрее :D
(сорри, только первую страницу прочел перед ответом)

9xakep 26.03.2012 08:41

Блин, объясните мне этот парадокс?! Почему, при написании...короче скрин:

Вот лог:
b1[0] :А, buk[0]: А // он нашел букву А, нашел букву А в массиве
А: 0 // нашел первый элемент массива случ. чисел: 0
b1[0] :0, buk[33]: // какого он снова начинает искать?
0: _
b1[1] :А, buk[0]: А
А: 0
b1[1] :0, buk[33]:
0: _

Вот лог любой другой цифры:
b1[0] :А, buk[0]: А // нашел первую букву, нашел ее в массиве
А: 24 // заменил ее на число в массиве случ. чисел
b1[1] :А, buk[0]: А // пошел дальше
А: 24

Так происходит если какая-нибудь буква по рандому равна 0?
=======
Короче нашел пока единственной решение, не генерировать 0. Поставил при генерации проверку. Теперь генерируется 34 числа, ни одно из которых != 0


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