почему через раз работает?
Вот этот код, по задумке выдает числа 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 } |
Пожалуйста, отформатируйте свой код!
Для этого его можно заключить в специальные теги: js/css/html и т.п., например: [js] ... ваш код... [/js] О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting. |
Для генерации случайных чисел лучше использовать такой код:
Math.floor(Math.random() * 99) // сгенерирует случайное целое в диапазоне 1-99 |
Цитата:
и все же сам не догонюсь, почему он даже когда работает, выдает по 1000 цифр, вместо того чтобы остановиться на document.write(arr) |
Ваша программа сложно написана. Никто не станет в ней разбираться, потому что это займет слишком много времени. Перепешите код, или опишите назначение программы в комментариях.
|
Цитата:
Здесь же срабатывает на arr.length>=25 даже когда там лежит 4 эл-та! :( Иногда при запуске срабатывает document.write(arr), только на сотую долю сек. и сразу же исчезают числа с экрана. В большинстве запусков не срабатывает - пустой экран. Только с 10-12 запуска отображает массив из ~ 1000 цифр. |
Цитата:
http://javascript.info/play/z0u8R или вот тоже рабочий вариант: http://javascript.info/play/f92EN но здесь генератор я позаимствовал из инета, а код в котором копаюсь, делал сам, и хочу в нем разобраться до конца. и по сравнению с "t = b && typeof this[i].shuffle!=='undefined' ? this[i].shuffle() : this[i];" мой код, для начинающего программера гора-а-аздо легче! |
Может я с утра еще не проснулся и туплю, но:
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; |
Я конеш до конца не врубился в ваш алгоритм, но у вас там была бесконечная рекурсия и поэтому скрипт вырубало, я её пофиксил и немного "причесал" ваш код, но т.к. до конца не понял, что в итоге нужно, то не знаю, правильно она работает или нет)
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 Цитата:
if (t = b && typeof this[i].shuffle !== 'undefined') { this[i].shuffle(); } else { this[i]; } |
Мне ваша программа кажется до жути не логичной. Проще не изменять ее, а переписать заново. Знаю что вам нужен именно ваш код, но вдруг пригодится, хотя он и не может добавлять случайный числа в уже существующий массив:
(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. |