Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Случайная загрузка страниц, Нужна помощь 
:(
    Опции темы
о0НиК0о
Дата 21.1.2007, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 21.1.2007

Репутация: нет
Всего: 1



Нужно решить следующею задачу:

Есть страницы:
1.htm
2.htm
3.htm
…
100.htm
На главной странице есть кнопка при нажатии которой из выше перечисленного списка страниц случайным образом выбирается и загружается одна страница.

Знающие люди помогите пожалуйста написать такой скрипт.
Очень надо, а знания Java у меня пока на нуле.

PM MAIL   Вверх
tux
Дата 21.1.2007, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 1
Всего: 132



Модератор: Перенес из Java: Общие вопросы
PM MAIL Skype GTalk Jabber YIM   Вверх
12345c
Дата 22.1.2007, 06:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 57
Всего: 101



Код
<button onclick="location=Math.floor(100*Math.random()+1)+'.htm';">Случ.выбор</button>


Это сообщение отредактировал(а) 12345c - 22.1.2007, 16:24
PM WWW   Вверх
о0НиК0о
Дата 22.1.2007, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 21.1.2007

Репутация: нет
Всего: 1



12345c, чёта у меня не работает smile

Я вот нашёл ещё такую конструкцию, здесь можно отдельно адрес каждой страницы прописать:

Код

<!-- Вставьте эту часть кода между тегами <HEAD></HEAD> вашего документа -->

<HEAD>

<script LANGUAGE="JavaScript">

<!-- Begin
function go_to(url) {
window.location=url;
}
function rand_link() {
var a;
a = 1+Math.round(Math.random()*3);   // a = random number between 1-3
if (a==1) go_to("http://www.google.ru");
if (a==2) go_to("http://breakthrough.ru");
if (a==3) go_to("http://forum.vingrad.ru/act-ST/f-104/t-133170/unread-1.html");
}
// End -->
</SCRIPT>

<!-- Вставьте эту часть кода в html документ -->

<BODY>
<CENTER>
<FORM NAME="myForm">
<INPUT TYPE="button" NAME="myButton" VALUE="Random link"
onClick="rand_link()">
</FORM>
</CENTER>

Возможно кому-нибудь понадобится smile

PM MAIL   Вверх
12345c
Дата 22.1.2007, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 57
Всего: 101



Я неправильно функцию написал: не randomize, а random, исправил выше.

Добавлено @ 16:29 
А та конструкция с адресами излишне многословна. В ней достаточно выбрать адрес из массива:

Код
<script>
a=["http://www.google.ru","http://breakthrough.ru",
  "http://forum.vingrad.ru/act-ST/f-104/t-133170/unread-1.html"]
</script>
<button onclick="location=a[Math.floor(a.length*Math.random())];">Случ.выбор</button>


Добавлено @ 16:33 
И использовать Math.round - несколько ошибочное занятие, потому что он округляет до ближайшего целого. Получится от 1 до 4.
PM WWW   Вверх
AKS
Дата 22.1.2007, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(12345c @  22.1.2007,  16:24 Найти цитируемый пост)
использовать Math.round - несколько ошибочное занятие

Да нет ничего "ошибочного" - вот здесь будут присутствовать все элементы массива:
Код

var arr = [1, 2, 3, 4, 5], iterator = 30, str = '';

while (iterator--)
    str += arr[Math.round(Math.random() * (arr.length - 1))] + '\n';

alert(str);

PM MAIL   Вверх
12345c
Дата 22.1.2007, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 57
Всего: 101



Они, конечно, будут, но с разной вероятностью, поэтому я назвал "несколько ошибочное". :)

А твой пример по-настоящему ошибочен, потому что Math.round(-0.6)==-1 . :)
PM WWW   Вверх
AKS
Дата 22.1.2007, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(12345c @  22.1.2007,  19:57 Найти цитируемый пост)
с разной вероятностью

Но позвольте, имея дело с Math.random, мы в любом случае столкнемся к какой-либо вероятностью. А уж какая она будет, "разная" или "голубая-красная" - угадать не получится.
Ни метод Math.floor, ни Math.round не сумеют обеспечить никакой закономерности...

Цитата(12345c @  22.1.2007,  19:57 Найти цитируемый пост)
твой пример по-настоящему ошибочен

Я бы сказал: "катастрофически ошибочен!" smile
Math.round(-0.6) == Math.floor(-0.6) ?
PM MAIL   Вверх
Zeroglif
Дата 22.1.2007, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(AKS @  22.1.2007,  20:50 Найти цитируемый пост)
Ни метод Math.floor, ни Math.round не сумеют обеспечить никакой закономерности...

Скажем так, flооr в эту закономерность не вмешивается, а round вмешивается (со своим самоваром). smile
PM MAIL WWW   Вверх
AKS
Дата 22.1.2007, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(Zeroglif @  22.1.2007,  21:15 Найти цитируемый пост)
round вмешивается

Неужели здесь есть некая закономерность, в которую можно вмешаться? 
Если уж на то пошло, то мы уже вмешались "по полной программе", умножив случайное число (от 0 до 1) на другое целое число, причем на то, которое нам угодно. И в таком случае дальнейшее вмешательство Math.round может внести лишь дополнительный "элемент неожиданности". Но ведь этого мы и хотели изначально, обратившись к Math.random.
Разве не так? smile

PM MAIL   Вверх
Zeroglif
Дата 22.1.2007, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(AKS @  22.1.2007,  21:55 Найти цитируемый пост)
Разве не так?

Неа. Допустим, в неком цикле будет так:

Код

Math.random() * 1;

Рэндом будет честно колошматить свою рэндомную "закономерность", а умножение на единицу будет... тоже честным, нетрудно догадаться, что одно в другое не лезет. То же самое с floor. Допустим, у нас диапазон целых от 0 до 3 (исключительно):

Код

Math.floor(Math.random() * 3);

Что делает floor:

Код

0 - 1 --> округл. до 0;
1 - 2 --> округл. до 1;
2 - 3 --> округл. до 2

3 ровных по размеру промежутка. Теперь берём round для того же диапазона:

Код

Math.round(Math.random() * 2);

Что делает round:

Код

0.0 - 0.5 --> округл. до 0;
0.5 - 1.5 --> округл. до 1;
1.5 - 2.0 --> округл. до 2

3 ровных промежутка? Нет. То есть, если представить себе, что рэндом выбрасывает значения вразнобой, но без дискриминации к конкретным значениям (с ровной частотой), то последующее округление с помощью round как раз занимается дискриминацией... крайних... негров. smile
PM MAIL WWW   Вверх
AKS
Дата 22.1.2007, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Zeroglif
Да я, в общем-то, готов согласиться, что есть такая штука, как "честная рэндомная закономерность". Даже если ее нет, то пусть будет. Как Вы пишите: "если представить себе..." - могу представить, почему бы и нет? Вот только не пойму, почему бы не добавить к одной "рэндомности" (от Math.random) еще другой "рэндомности" (от Math.round)? Если только из жалости к "задискриминированным неграм"... ;)
PM MAIL   Вверх
Zeroglif
Дата 22.1.2007, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(AKS @  22.1.2007,  23:13 Найти цитируемый пост)
Вот только не пойму, почему бы не добавить к одной "рэндомности" (от Math.random) еще другой "рэндомности"

Потому что "другая" - это обычное закономерное округление, вклинивающееся в общий принцип раздачи значений, которые были "chosen randomly or pseudo randomly with approximately uniform distribution over that range".
PM MAIL WWW   Вверх
AKS
Дата 23.1.2007, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Zeroglif
Ну, хорошо. Как я писал - я готов согласиться, что random дает "честную закономерность", хотя  черным (да еще и жирным! ;) ) по белому написано, что это должна быть лишь приблизительно-равномерная выборка. Но разве затем не происходит какой-либо трансформации в результате наших действий, того же умножения?
У меня в голове "крутится" такой пример. Умножая (псевдо)случайное число на 10 и используя floor, мы получаем закономерность - меньше 0.1*** -> 0, меньше 0.2*** -> 1 и т.д. Но вот умножив, к примеру, на 11, получим ли мы желанную закономерность? К тому же надо учесть, что кол-во знаков в числе, выдаваемом методом Math.random, варьируется в пределах 16-20. И если взять и передать методу Math.floor  19-и значное число (0.99999999999999999) - то он возвратит единицу вместо ожидаемого нуля.
Безусловно имеются нюансы, я поэтому и писал об отсутствии закономерностей. Теоритически - все складно получается, но можно ли доказать практическим путем наличие закономерности во всей цепи наших (напару с браузером) действий? Лично мне это представляется невозможным. Я также надеюсь, что никто не будет браться за практические примеры, иначе нас тут всех запишут сами знаете в какую "категорию пассажиров"...
На всякий случай напомню, что я не против floor, и я не за round, и я отдаю себе отчет в том, что за "трюк" с round происходит в моем первом примере, и почему пример выдает необходимые результаты...
PM MAIL   Вверх
Zeroglif
Дата 23.1.2007, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(AKS @  23.1.2007,  10:05 Найти цитируемый пост)
должна быть лишь приблизительно-равномерная выборка

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

Цитата(AKS @  23.1.2007,  10:05 Найти цитируемый пост)
Но разве затем не происходит какой-либо трансформации в результате наших действий, того же умножения?

Происходит, но к каждому значению применяется одно и тоже умножающее действо, что не влияет на частоту.

Цитата(AKS @  23.1.2007,  10:05 Найти цитируемый пост)
Безусловно имеются нюансы, я поэтому и писал об отсутствии закономерностей. Теоретически - все складно получается, но можно ли доказать практическим путем наличие закономерности во всей цепи наших (напару с браузером) действий? Лично мне это представляется невозможным.

Легко и непринуждённо всё проверяется. Раз уж теория не убеждает. smile В примере проверим частоту обращения к элементам массива:
Код

// round
var a = [0, 0, 0, 0];
var i = 10000;
while (i--) {
    var mr = Math.round(Math.random() * 3);
    a[mr]++;
}
alert('Частота --> ' + a); // --> 1657,3369,3324,1650


Код

// floor
var a = [0, 0, 0, 0];
var i = 10000;
while (i--) {
    var mr = Math.floor(Math.random() * 4);
    a[mr]++;
}
alert('Частота --> ' + a); // --> 2553,2447,2534,2466

Как видите (по моим snapshot-результатам), floor не мешает получать относительно равномерную выборку, а round дискриминирует крайние значения. Соответственно, если возвращаться к первоначальному вопросу в этой ветке (про выдачу страниц), то 2 крайние страницы  при использовании round будут загружаться реже других (но чтобы это стало заметным, надо кликать кнопку много-много раз). Вы можете менять пример, расширить массив и умножать на 11 или 10, начинать не с нуля и т.п. - это никак не изменит логику.


Это сообщение отредактировал(а) Zeroglif - 23.1.2007, 13:23
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0969 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.