Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> рандомизатор 
V
    Опции темы
xXvladXx
Дата 1.4.2008, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бездарь
*


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

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



на входе файл
Цитата

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 

скрипт
Цитата


foreach(&random_line('links.txt',5)){
print $new_text."----";
}

sub random_line {
 $filename = $_[0];
 $lines = $_[1];
 open(FFF, '<', $filename);
 #flock(FFF,2);
 @array = (<FFF>);
 close(FFF);
 @id1 = ();
 $maxrand = $#array - $lines + 1;
 for $i (0 .. $lines)
 {
  push @id1, int(rand($maxrand));
 }
 @id2 = sort {$a <=> $b} @id1;
 @rv = ();
 for $i (0 .. $#id2)
 {
  $rv[$i] = $array[($id2[$i] + $i)];
  $rv[$i] =~ s/\r?\n$//;

 }

 undef @array;
 undef @id;
 return @rv;
}

по идеи должно вывести чтото типа
Цитата

1 ----
2 ----
3 ----
4 ----
5 ----

а выводит
Цитата

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15  ----



Это сообщение отредактировал(а) xXvladXx - 1.4.2008, 11:58
PM MAIL   Вверх
shamber
Дата 1.4.2008, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



Уважаемый ваш скрипт выводит нечто совсем другое.
Код

------------------------------------------

$new_text не определена.

Что-то ваш скрипт делает совершенно противоположное.
Вы лучше скажите, чего вы хотите. просто добавить в конце строчки ---?

Это сообщение отредактировал(а) shamber - 1.4.2008, 12:12
PM MAIL Jabber   Вверх
xXvladXx
Дата 1.4.2008, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бездарь
*


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

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



нет
я хочу чтоб он в случайным порядке вывел $lines строчек

Добавлено через 1 минуту и 33 секунды
ой переписыл и ошибся
foreach(&random_line('links.txt',5)){
print $_."----";
}
PM MAIL   Вверх
shamber
Дата 1.4.2008, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



у меня выводит
Код

3----
4----
7----
10----
12----
15----



чтобы выводил нужное число, просто добавьте
Код



........
sub random_line {
 $filename = $_[0];
 $lines = $_[1];
 $lines--;
........



Это сообщение отредактировал(а) shamber - 1.4.2008, 12:46
PM MAIL Jabber   Вверх
xXvladXx
Дата 2.4.2008, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бездарь
*


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

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



ВО! щас понял в чем глюк тока как исправить хз((
вот так выводит норм рандомно 5 строк 
Цитата

$new_text=join("\n",random_line('links.txt',5))."\n";
print $new_text;


sub random_line {
 my $filename = $_[0];
 my $lines = $_[1];
 open(FFF, '<', $filename);
 #flock(FFF,2);
 my @array = (<FFF>);
 close(FFF);
 my @id1 = ();
 $maxrand = $#array - $lines + 1;
 for $i (0 .. $lines)
 {
  push @id1, int(rand($maxrand));
 }
my @id2 = sort {$a <=> $b} @id1;
my @rv = ();
 for $i (0 .. $#id2)
 {
  $rv[$i] = $array[($id2[$i] + $i)];
  $rv[$i] =~ s/\r?\n$//;

 }

 undef @array;
 undef @id;
 return @rv;
}

а вот так почемуто все...
Цитата

$/=undef ;
$new_text=join("\n",random_line('links.txt',5))."\n";
print $new_text;


sub random_line {
 my $filename = $_[0];
 my $lines = $_[1];
 open(FFF, '<', $filename);
 #flock(FFF,2);
 my @array = (<FFF>);
 close(FFF);
 my @id1 = ();
 $maxrand = $#array - $lines + 1;
 for $i (0 .. $lines)
 {
  push @id1, int(rand($maxrand));
 }
my @id2 = sort {$a <=> $b} @id1;
my @rv = ();
 for $i (0 .. $#id2)
 {
  $rv[$i] = $array[($id2[$i] + $i)];
  $rv[$i] =~ s/\r?\n$//;

 }

 undef @array;
 undef @id;
 return @rv;
}

$/=undef ; 
используется далее
в проге цикл и получается так что при первом рандомизе все ок а дальше глючит(((
PM MAIL   Вверх
amg
Дата 2.4.2008, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



$/ - это разделитель записей при чтении файла. Вы ему делаете глобально undef. В результате операция my @array = (<FFF>); создает массив из одного элемента, в котором содержится мультистрока (весь файл), ... дальше понятно.

Как исправить. Добавьте в подпрограмму random_line перед открытием файла local $/ = "\n";
PM MAIL   Вверх
KSURi
Дата 2.4.2008, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

sub random_line {
  my($file, $num) = @_;

  open(IN, $file) || die $!;
  chomp(my @lines = <IN>);
  close IN;

  my @retval;
  push(@retval, $lines[int rand scalar @lines]) for 1..$num;

  @retval
}



--------------------
Died at Life.pl line 21
PM Jabber   Вверх
xXvladXx
Дата 2.4.2008, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бездарь
*


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

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



О! спс)
PM MAIL   Вверх
amg
Дата 2.4.2008, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



KSURi, не все так просто. Твой код, к сожалению, не исключает возврат одной и той же строки несколько раз.
PM MAIL   Вверх
arto
Дата 2.4.2008, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



sub random_line ($$) {
  my ($file,$num) = @_;
  open F,$file or return;
  my @a = sort { int (rand (3))-1 } map { $_ = <F>; $_ } 0..$num;
  close F; chomp @a;
  return @a;
}


PM MAIL ICQ   Вверх
amg
Дата 2.4.2008, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



arto, остроумно! Но выборка будет только из первых элементов массива. Поправить можно так:
Код

my @a = (sort { int (rand (3))-1 } <F>)[1..$num];

В случае кода KSURi:
Код

push(@retval, splice(@lines, int rand @lines, 1)) for 1..$num;

Но первоначальный алгоритм, приведенный xXvladXx, все же, кажется, более экономный. И у него отличие: строки идут в том порядке, в котором они были в исходном файле.
PM MAIL   Вверх
ginnie
Дата 2.4.2008, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Уважаемый arto, не подскажите, а сортировка со случайной функцией не может длиться бесконечно долго?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
arto
Дата 2.4.2008, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



1. map { $_ = <F>; $_ } 0..$num читает из F $num первых строк.
2. нет.

Добавлено через 1 минуту и 58 секунд
как я понял, задача заключается "в случайным порядке вывел $lines строчек"
PM MAIL ICQ   Вверх
ginnie
Дата 2.4.2008, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



arto, если "2. нет." относится к моему вопросу, то на чем основана Ваша уверенность?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
amg
Дата 2.4.2008, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



arto, фраза топикстартера "я хочу чтоб он в случайным порядке вывел $lines строчек" действительно допускает двоякое толкование, но судя по коду, результатом работы которого он был доволен, требовалось все же извлечь из всего файла случайные строки в количестве $lines.

ginnie, код arto с сортировкой по случайной функции работает не бесконечно долго (проверено).
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




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


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

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