Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   почему через раз работает? (https://javascript.ru/forum/events/19061-pochemu-cherez-raz-rabotaet.html)

Marwell 24.07.2011 23:21

почему через раз работает?
 
Вот этот код, по задумке выдает числа 1-25 в хаотичном порядке, и работает в песочнице через раз...:cray:
(не надо писать, что генератор перемешивания можно в 1 строчку написать, нужен именно этот код! )
Да, и пока что он работает не правильно, но думаю сам догонюсь, уже 5 дней работаю над ним...
Но тем не менее, запускается только некоторые разы... ???

var arr=[1,2]                                     // добавил в массив 2 аргумента, в конце их просто выкину
ra()                                              // собственно запуск всей программы
function ra(){
              function rand() {                   // 2 - запуск random - генератор 1-25
                              a=Math.random()     // a=случайное число от 0-1
                              a=a+""              // а - переводу в строку
                              a=+a.slice(2,4)     // беру из строки 2 символа, получаю число 0-99
                              }
              do {rand()}                      // 1 - выполнение random пока не попадем в интервал 1-25
              while (a>25);
              if (a==0){do {rand()}        // если сгенерился 0, он не нужен, то заново random
                        while (a==0)}
              else {prov(a)};                  // если попали в интервал 1-25, запускаем проверку, есть ли в массиве число
              }
function prov(t){                                      // 3 - ф-ия проверки в массиве числа
                  var sh=1                               // счетчик количества проверяемых эл-ов в массиве
                  for (var k in arr)                     // перебор массива 
                                    {
                                    var ind = arr[k]              // ind делаю = эл-нт массива
                                    if (t==ind) { ra() }             // если число уже есть в массиве, запуск random
                                    if (sh>=arr.length) {dob(t)}   // если проверен весь массив, запуск ф-ии добавления в массив
                                    else {sh=++sh}                 //если эл-нт массива проверен и его нет, то счетчик+1, и след.эл-т проверяется
                                    }
                 }
function dob(tr){                      // 4 - ф-ия добавления в массив
                arr.push(tr)             // если сюда попало число, то его 100% нет в массиве, и сразу добавляется в массив
                if (arr.length>=25)    // если массив уже = 25, что и требовалось
                   {arr.splice(3,10);   // то отбрасываем первые 2 ненужных эл-та и отображаем 10 (позже 25 сделаю)
                   document.write(arr)} // готовый массив отображаем
                else { ra() }               // если массив <25 эл-ов, то запускаем генерацию числа random
               }

melky 24.07.2011 23:39

Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[js]
... ваш код...
[/js]


О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

SlavaPav 25.07.2011 00:01

Для генерации случайных чисел лучше использовать такой код:
Math.floor(Math.random() * 99) // сгенерирует случайное целое в диапазоне 1-99

Marwell 25.07.2011 00:25

Цитата:

Сообщение от SlavaPav (Сообщение 115199)
Для генерации случайных чисел лучше использовать такой код:
Math.floor(Math.random() * 99) // сгенерирует случайное целое в диапазоне 1-99

спасибо за код, меня интересует именно моя программа, в чем глюк? Уже и на листочке напечатал, все записываю - в теории все работает, на практике нет...
и все же сам не догонюсь, почему он даже когда работает, выдает по 1000 цифр, вместо того чтобы остановиться на
document.write(arr)

SlavaPav 25.07.2011 00:28

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

Marwell 25.07.2011 09:51

Цитата:

Сообщение от SlavaPav (Сообщение 115207)
Ваша программа сложно написана. Никто не станет в ней разбираться, потому что это займет слишком много времени. Перепешите код, или опишите назначение программы в комментариях.

все расписал, разбираться и не надо в ней, Илья например, на занятиях, сразу мог сказать типа "у тебя там-то то-то", о чем я не знал... Ему по крайней мере сразу видны косяки.
Здесь же срабатывает на arr.length>=25 даже когда там лежит 4 эл-та! :(
Иногда при запуске срабатывает document.write(arr), только на сотую долю сек. и сразу же исчезают числа с экрана. В большинстве запусков не срабатывает - пустой экран. Только с 10-12 запуска отображает массив из ~ 1000 цифр.

Marwell 25.07.2011 09:59

Цитата:

Сообщение от SlavaPav (Сообщение 115199)
Для генерации случайных чисел лучше использовать такой код:
Math.floor(Math.random() * 99) // сгенерирует случайное целое в диапазоне 1-99

Вообще, в итоге все должно работать вот так:
http://javascript.info/play/z0u8R
или вот тоже рабочий вариант:
http://javascript.info/play/f92EN
но здесь генератор я позаимствовал из инета, а код в котором копаюсь, делал сам, и хочу в нем разобраться до конца.
и по сравнению с
"t = b && typeof this[i].shuffle!=='undefined' ? this[i].shuffle() : this[i];"
мой код, для начинающего программера гора-а-аздо легче!

walik 25.07.2011 10:17

Может я с утра еще не проснулся и туплю, но:

do {rand()} // 1 - выполнение random пока не попадем в интервал 1-25
   while (a>25);

а потом пишите
if (a==0){
   do {rand()}   // если сгенерился 0, он не нужен, то заново random
      while (a==0);
}

После второго цикла число все равно же может быть больше 25 ?
и вообще зачем два цикла, если можно совместить условия ?
while(a>25 && a==0)
   {rand()}




if (t==ind) { ra() }   // если число уже есть в массиве, запуск random

Ну а работа функции то продолжится, может следует ее прерывать ?
return;

kobezzza 25.07.2011 10:31

Я конеш до конца не врубился в ваш алгоритм, но у вас там была бесконечная рекурсия и поэтому скрипт вырубало, я её пофиксил и немного "причесал" ваш код, но т.к. до конца не понял, что в итоге нужно, то не знаю, правильно она работает или нет)
var arr = [1, 2];
ra();
function ra(){
	var rand = function() { return a = Math.random().toString().slice(2,4); }, a;
	do { a = rand(); }
	while (a > 25);
	
	if (a === 0) {
		do { rand(); }
		while (a === 0);
	} else {
		rand = null;
		return prov(+a);
	}
}
function prov(t){
	var sh = 1, k, ind;
	for (k in arr) {
		ind = arr[k]
		if (t === ind) { ra(); return false; } // вот тут была бесконечная рекурсия, т.к. функция не прерывалась. Я поставил return false; , хотя в принципе можно было написать return чего угодно или просто return;
		if (sh >= arr.length) {
			dob(t);
		} else { sh++; }
	}
}
function dob(tr) {
	arr.push(tr);
	if (arr.length >= 25) {
		arr.splice(3,10);
		document.write(arr);
	} else { ra(); }
}


Пример ответа: 1,2,12,7,4,24,14,15,23,10,5,21,18,6,17

Цитата:

"t = b && typeof this[i].shuffle!=='undefined' ? this[i].shuffle() : this[i];"
Это строковый условный оператор, очень удобно использовать, в классическом виде - это выглядит так:
if (t = b && typeof this[i].shuffle !== 'undefined') {
	this[i].shuffle();
} else { this[i]; }

SlavaPav 25.07.2011 20:21

Мне ваша программа кажется до жути не логичной. Проще не изменять ее, а переписать заново. Знаю что вам нужен именно ваш код, но вдруг пригодится, хотя он и не может добавлять случайный числа в уже существующий массив:
(function() {
    this.arrayFilledWithRandomNumbers = function(amount_of_numbers) {
        var base = amount_of_numbers,
            random_number,
            array = [];
        
        while (amount_of_numbers) {
            random_number = randomNumber(base);
            if (!hasNumber(array, random_number)) {
                array.push(random_number);
                amount_of_numbers -= 1;
            }
        }
        return array;
    };
    
    function hasNumber(array, number) {
        var has_element = false;
        array.forEach(function(element) {
            if (element == number) {
                has_element = true;
            }
        });
        return has_element;
    }
    
    function randomNumber(base) {
        return Math.floor(Math.random() * base);
    }
}());

console.log(arrayFilledWithRandomNumbers(3));
console.log(arrayFilledWithRandomNumbers(54));
console.log(arrayFilledWithRandomNumbers(12));


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