2015-06-02 3 views
-2

Мне нужно знать, как я могу заполнить массив в perl случайным образом. Например: я хочу объявить массив, содержащий 10 элементов, меньших 60. Может кто-нибудь объяснить мне, как я могу это сделать или отправить мне какой-нибудь путеводитель? Я был бы так благодарен.Случайная сортировка массива - perl

+2

Используйте цикл и команду push, чтобы поместить новое случайное число в массив с каждой итерацией цикла. –

+3

См. 'Shuffle()' in 'perldoc List :: Util' http://perldoc.perl.org/List/Util.html#@[email protected]' List :: Util' является стандартным модулем который установлен с Perl. Список всех стандартных модулей см. В разделе «perldoc perlmodlib» http://perldoc.perl.org/perlmodlib.html – shawnhcorey

+0

@shawnhcorey: 'shuffle' возвращает список в произвольном порядке, он не создает случайные значения. – Toto

ответ

5

Я предполагаю, что вы имели в виду «десять неотрицательные целые числа меньше, чем 60».

С возможностью повторами:

my @rands = map { int(rand(60)) } 1..10; 

Например,

$ perl -E'say join ",", map { int(rand(60)) } 1..10;' 
0,28,6,49,26,19,56,32,56,16  <-- 56 is repeated 

$ perl -E'say join ",", map { int(rand(60)) } 1..10;' 
15,57,50,16,51,58,46,7,17,53 

$ perl -E'say join ",", map { int(rand(60)) } 1..10;' 
13,57,26,47,30,14,47,55,39,39  <-- 47 and 39 are repeated 

без возможности повторов:

use List::Util qw(shuffle); 

my @rands = (shuffle 0..59)[0..9]; 

Например,

$ perl -MList::Util=shuffle -E'say join ",", (shuffle 0..59)[0..9];' 
13,50,8,21,11,24,28,51,55,38 

$ perl -MList::Util=shuffle -E'say join ",", (shuffle 0..59)[0..9];' 
1,0,58,46,47,49,52,33,5,13 

$ perl -MList::Util=shuffle -E'say join ",", (shuffle 0..59)[0..9];' 
19,43,45,49,23,53,2,38,59,35 
+0

Я не рассматривал использование тасования, как это. +1 – Toto

+0

Итак, когда я хочу заполнить массив, содержащий элементы «n», могу ли я использовать: «@rand = map {int (rand (60))} n;"? Или создайте цикл «для» и введите счет таким образом ?: «my $ tab [$ i] = map {int (rand (60))};". Я использовал второй вариант до момента, и мой компилятор показал ошибки. Что не так? – Martini

+0

Первый будет присваивать только один элемент, и мне будет трудно найти что-то, что не соответствует второму фрагменту. – ikegami

2

Вы можете просто сделать:

my @r = map int(rand(60)), 0..9; 
say Dumper\@r; 
+0

Я просто набрал это с помощью '1..10' :) – simbabque

+0

@simbabque: Я сохранил один символ. ;-) – Toto

+0

Вы можете сэкономить больше, используя [Data :: Printer] (http://p3rl.org/Data::Printer) и даже получите бесплатные колоссы! 'p @ r' =) – simbabque

-1

Вы можете воспользоваться случайной сортировки в Perl хэш-ключей. Это заполнит массив из 10 элементов случайным образом каждый раз, когда вы запускаете его:

use warnings; 
use strict; 

my @nums = (1 .. 60); 

my %data; 

$data{$_}++ foreach @nums; 

my $count = 0; 
my @random; 
foreach (keys %data){ 
    $count++; 
    push @random, $_ if $count <= 10; 
} 
+0

Это одно арканное решение – simbabque

+1

Это не случайно, он дает одинаковый результат при каждом прогоне. – Toto

+1

@Toto, Не в новых версиях Perl, и не всегда в старых версиях Perl, но я согласен, что это не путь. Во-первых, я думаю, что это не совсем случайно. – ikegami

Смежные вопросы