Как сгенерировать массив со случайными значениями, не используя цикл? - PullRequest
24 голосов
/ 04 ноября 2010

Как я могу создать массив в Perl с 100 случайными значениями, без использования цикла?

Я должен избегать всякого рода циклов, таких как «для», foreach », пока. Это мое упражнение из моей лаборатории. Я не могу найти способ решить эту проблему, потому что я новичок в Perl.

В C генерация этого массива будет очень простой, но я не знаю, как это сделать в Perl.

Ответы [ 24 ]

2 голосов
/ 04 ноября 2010

Генерация данных:

my @array = map { rand() } (0..99);

Распечатайте данные, чтобы показать, что у вас правильный результат:

print "$_\n" foreach (@array);

Цикл генерации скрыт (ключевое слово цикла не видно - только функция / оператор).

1 голос
/ 04 ноября 2010

Рекурсия:

#!/usr/bin/perl
use warnings; use strict;

my @rands;
my $i=1;

sub push_rand {
    return if $#rands>=99;
    push @rands, rand;
    push_rand();
}

push_rand();

for (@rands) { print "$i: $_\n"; $i++; }
1 голос
/ 04 ноября 2010

В соответствии с запросами от слушателей, решение не- regex :

$s="D" x 100; 
$s=~s/D/rand()." "/ge; 
@s=split(/ /,$s);
0 голосов
/ 03 марта 2018

Вопрос: что-то делать (и что-то происходит с вызовом rand()) несколько раз без использования цикла. Подразумевается и без повторения источника. Ни один из приведенных выше ответов на самом деле не отвечает на этот вопрос. Они либо повторяют источник, либо скрывают зацикливание. Вот общий подход, который смягчает повторение и не скрывает зацикливание (реализуя его с использованием вычисленного goto, или регулярного выражения, или рекурсии, и т. Д.). Я называю этот подход «управляемым повторением».

100 имеет четыре основных фактора: 2 * 2 * 5 * 5 == 100. Итак, нам нужны два менеджера повторения, пять и два:

sub two{ my $y=shift; ($y->(), $y->()) }
sub five{my $y=shift; ($y->(), $y->(), $y->(), $y->(), $y->()) } 

затем вызовите их - мы не рекурсивны, потому что вырожденный случай рекурсии представляет собой циклический тест - просто вызов их:

my @array = five(sub{five(sub{two(sub{two(sub{rand()})})})});

Вот вам общий способ вызывать что-то заданное количество раз без использования цикла, скорее, путем делегирования повторения эффективным и контролируемым образом.

Вопрос для обсуждения: в каком порядке должны быть пятерки и двойки и почему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...