【问题标题】:Random flling the array - perl随机填充数组 - perl
【发布时间】:2015-06-02 12:51:55
【问题描述】:

我需要知道如何在 perl 中随机填充数组。例如:我想声明一个包含 10 个小于 60 的元素的数组。有人能解释一下我该怎么做或给我发送任何指南吗?我将不胜感激。

【问题讨论】:

  • 使用循环和 push 命令在每次循环迭代时将新的随机数放入数组中。
  • 参见shuffle() in perldoc List::Util perldoc.perl.org/List/Util.html#@values-=-shuffle-@values List::Util 是与 Perl 一起安装的标准模块。有关所有标准模块的列表,请参阅 perldoc perlmodlib perldoc.perl.org/perlmodlib.html
  • @shawnhcorey: shuffle 以随机顺序返回一个列表,它不会构建随机值。
  • @Toto,如果您希望所有十个元素都不同,您可以使用shuffle。看我的回答。
  • @Toto:请参阅我上面评论中的第一个链接。它有一个如何随机填充数字 0 .. 51 的示例。

标签: arrays perl random


【解决方案1】:

我假设您的意思是“小于 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

【讨论】:

  • 我没有考虑过像这样使用 shuffle。 +1
  • 所以当我想填充一个包含'n'个元素的数组时,我可以使用:“@rand = map {int (rand(60)) } n;”吗?或者创建一个循环'for'并以这种方式输入计数?:“my $tab[$i] = map {int (rand(60)) };”。我之前使用了第二个选项,我的编译器显示错误。怎么了?
  • 第一个只会分配一个元素,我很难找到第二个 sn-p 没有问题的东西。
  • 如果没有问题,编译器错误怎么办?此外,似乎我的编译器没有读取前缀“我的”(未着色)
  • 我没有说什么都错了;我说这是完全错误的。这就像有人从字典中随机挑选单词组成了一个句子。
【解决方案2】:

你可以这样做:

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

【讨论】:

  • 我只是用1..10 打出来的:)
  • @simbabque:我保存了一个字符。 ;-)
  • 您可以使用Data::Printer 节省更多,甚至可以获得免费的colos! p @r =)
【解决方案3】:

您可以利用 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;
}

【讨论】:

  • 这不是随机的,每次运行都会给出相同的结果。
  • 我不同意这一点,但我认为讨论最好喝一两杯啤酒。 ;)
  • @simbabque 你在找我吗?
  • 当您甚至没有可行的解决方案时,谈论可读性是没有意义的。随意将map 替换为更复杂的for+push,但不要将rand 替换为哈希键排序。您发布的内容糟糕。
  • @simbabque 当然,但drinks 在他
猜你喜欢
  • 2017-06-04
  • 2011-01-23
  • 1970-01-01
  • 2016-05-11
  • 2013-09-16
  • 1970-01-01
  • 2020-02-26
相关资源
最近更新 更多