24.07.2011, 23:21
|
Интересующийся
|
|
Регистрация: 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.
|
|
24.07.2011, 23:39
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
Пожалуйста, отформатируйте свой код!
Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[js]
... ваш код...
[/js]
О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.
|
|
25.07.2011, 00:01
|
|
Аспирант
|
|
Регистрация: 25.02.2010
Сообщений: 57
|
|
Для генерации случайных чисел лучше использовать такой код:
Math.floor(Math.random() * 99) // сгенерирует случайное целое в диапазоне 1-99
|
|
25.07.2011, 00:25
|
Интересующийся
|
|
Регистрация: 05.04.2011
Сообщений: 11
|
|
Сообщение от SlavaPav
|
Для генерации случайных чисел лучше использовать такой код:
Math.floor(Math.random() * 99) // сгенерирует случайное целое в диапазоне 1-99
|
спасибо за код, меня интересует именно моя программа, в чем глюк? Уже и на листочке напечатал, все записываю - в теории все работает, на практике нет...
и все же сам не догонюсь, почему он даже когда работает, выдает по 1000 цифр, вместо того чтобы остановиться на
document.write(arr)
Последний раз редактировалось Marwell, 25.07.2011 в 00:30.
|
|
25.07.2011, 00:28
|
|
Аспирант
|
|
Регистрация: 25.02.2010
Сообщений: 57
|
|
Ваша программа сложно написана. Никто не станет в ней разбираться, потому что это займет слишком много времени. Перепешите код, или опишите назначение программы в комментариях.
|
|
25.07.2011, 09:51
|
Интересующийся
|
|
Регистрация: 05.04.2011
Сообщений: 11
|
|
Сообщение от SlavaPav
|
Ваша программа сложно написана. Никто не станет в ней разбираться, потому что это займет слишком много времени. Перепешите код, или опишите назначение программы в комментариях.
|
все расписал, разбираться и не надо в ней, Илья например, на занятиях, сразу мог сказать типа "у тебя там-то то-то", о чем я не знал... Ему по крайней мере сразу видны косяки.
Здесь же срабатывает на arr.length>=25 даже когда там лежит 4 эл-та!
Иногда при запуске срабатывает document.write(arr), только на сотую долю сек. и сразу же исчезают числа с экрана. В большинстве запусков не срабатывает - пустой экран. Только с 10-12 запуска отображает массив из ~ 1000 цифр.
Последний раз редактировалось Marwell, 25.07.2011 в 09:53.
|
|
25.07.2011, 09:59
|
Интересующийся
|
|
Регистрация: 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.
|
|
25.07.2011, 10:17
|
|
Профессор
|
|
Регистрация: 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 клацай
|
|
25.07.2011, 10:31
|
|
Быдлокодер;)
|
|
Регистрация: 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, 25.07.2011 в 12:00.
|
|
25.07.2011, 20:21
|
|
Аспирант
|
|
Регистрация: 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.
|
|
|
|