Javascript.RU

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

почему через раз работает?
Вот этот код, по задумке выдает числа 1-25 в хаотичном порядке, и работает в песочнице через раз...
(не надо писать, что генератор перемешивания можно в 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
               }

Последний раз редактировалось Marwell, 25.07.2011 в 10:05.
Ответить с цитированием
  #2 (permalink)  
Старый 24.07.2011, 23:39
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

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

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


О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.
Ответить с цитированием
  #3 (permalink)  
Старый 25.07.2011, 00:01
Аватар для SlavaPav
Аспирант
Отправить личное сообщение для SlavaPav Посмотреть профиль Найти все сообщения от SlavaPav
 
Регистрация: 25.02.2010
Сообщений: 57

Для генерации случайных чисел лучше использовать такой код:
Math.floor(Math.random() * 99) // сгенерирует случайное целое в диапазоне 1-99
Ответить с цитированием
  #4 (permalink)  
Старый 25.07.2011, 00:25
Интересующийся
Отправить личное сообщение для Marwell Посмотреть профиль Найти все сообщения от Marwell
 
Регистрация: 05.04.2011
Сообщений: 11

Сообщение от SlavaPav Посмотреть сообщение
Для генерации случайных чисел лучше использовать такой код:
Math.floor(Math.random() * 99) // сгенерирует случайное целое в диапазоне 1-99
спасибо за код, меня интересует именно моя программа, в чем глюк? Уже и на листочке напечатал, все записываю - в теории все работает, на практике нет...
и все же сам не догонюсь, почему он даже когда работает, выдает по 1000 цифр, вместо того чтобы остановиться на
document.write(arr)

Последний раз редактировалось Marwell, 25.07.2011 в 00:30.
Ответить с цитированием
  #5 (permalink)  
Старый 25.07.2011, 00:28
Аватар для SlavaPav
Аспирант
Отправить личное сообщение для SlavaPav Посмотреть профиль Найти все сообщения от SlavaPav
 
Регистрация: 25.02.2010
Сообщений: 57

Ваша программа сложно написана. Никто не станет в ней разбираться, потому что это займет слишком много времени. Перепешите код, или опишите назначение программы в комментариях.
Ответить с цитированием
  #6 (permalink)  
Старый 25.07.2011, 09:51
Интересующийся
Отправить личное сообщение для Marwell Посмотреть профиль Найти все сообщения от Marwell
 
Регистрация: 05.04.2011
Сообщений: 11

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

Последний раз редактировалось Marwell, 25.07.2011 в 09:53.
Ответить с цитированием
  #7 (permalink)  
Старый 25.07.2011, 09:59
Интересующийся
Отправить личное сообщение для Marwell Посмотреть профиль Найти все сообщения от Marwell
 
Регистрация: 05.04.2011
Сообщений: 11

Сообщение от SlavaPav Посмотреть сообщение
Для генерации случайных чисел лучше использовать такой код:
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];"
мой код, для начинающего программера гора-а-аздо легче!

Последний раз редактировалось Marwell, 25.07.2011 в 10:02.
Ответить с цитированием
  #8 (permalink)  
Старый 25.07.2011, 10:17
Аватар для walik
Профессор
Отправить личное сообщение для walik Посмотреть профиль Найти все сообщения от walik
 
Регистрация: 09.11.2009
Сообщений: 1,101

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

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;
__________________
"Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете."
Мой сертификат :-D клацай
Ответить с цитированием
  #9 (permalink)  
Старый 25.07.2011, 10:31
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Я конеш до конца не врубился в ваш алгоритм, но у вас там была бесконечная рекурсия и поэтому скрипт вырубало, я её пофиксил и немного "причесал" ваш код, но т.к. до конца не понял, что в итоге нужно, то не знаю, правильно она работает или нет)
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]; }
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 25.07.2011 в 12:00.
Ответить с цитированием
  #10 (permalink)  
Старый 25.07.2011, 20:21
Аватар для SlavaPav
Аспирант
Отправить личное сообщение для SlavaPav Посмотреть профиль Найти все сообщения от SlavaPav
 
Регистрация: 25.02.2010
Сообщений: 57

Мне ваша программа кажется до жути не логичной. Проще не изменять ее, а переписать заново. Знаю что вам нужен именно ваш код, но вдруг пригодится, хотя он и не может добавлять случайный числа в уже существующий массив:
(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));

Последний раз редактировалось SlavaPav, 25.07.2011 в 20:41.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему данный скрипт работает только в IE? hacker_007 Общие вопросы Javascript 4 08.09.2011 16:58
Регулярные выражения работают через раз San4ezy Общие вопросы Javascript 5 05.10.2010 01:50
Почему скрипт работает в IE6 и не работает в opera и IE8? msufx Javascript под браузер 6 18.09.2009 18:44
Почему не работает JS с подгруженными в DOM элементами? V-z-z-HobboT jQuery 6 30.03.2009 14:02
почему не работает <body onload=test()> Ichigeki Общие вопросы Javascript 11 29.10.2008 13:49