Chinaunix

标题: perl实例精解的一道题,求解 [打印本页]

作者: 超级细菌    时间: 2011-03-08 15:09
标题: perl实例精解的一道题,求解
编写一段脚本 , 从一叠纸牌中随机抽取 10 张 , 并打印结果值 。
a. 该脚本应当先借助 foreach 循环构建一套 52 张牌 。
b. 外层循环负责按照花色遍历整套纸牌:
梅花、 方块 、 红桃 、 黑桃 。 内层循环则针对每一种花色
遍历所有数字 : A 、到 10 、 J 、 Q 以及 K 。 从各花色获得的纸牌都将赋值到一个数组中 。
c. 使用 rand() 函数从上述数组中随机获得一张纸牌 。
这样做便能保证获得的 10 张纸牌互不重复 。
作者: zhlong8    时间: 2011-03-08 15:19
#!/usr/bin/perl -w

use 5.012;
use List::Util 'shuffle';
use Data::Dumper;

my @cards;

for my $color ('梅花', '方块', '红桃', '黑桃') {
    for my $point ( 'A', 2 .. 10, 'J', 'Q', 'K') {
        push @cards, [$color, $point];
    }
}

print Dumper [(shuffle @cards)[0 .. 9]]
作者: lxb456900    时间: 2011-03-10 10:02
提示: 作者被禁止或删除 内容自动屏蔽
作者: seufy88    时间: 2011-03-10 10:10
#!/usr/bin/perl -w

use 5.012;
use List::Util 'shuffle';
use Data:umper;

my @cards;

for  ...
zhlong8 发表于 2011-03-08 15:19



遇到生疏的模块又高兴又怕,高兴的是学到新模块了,怕的是我为什么没用过看过这个模块
作者: zhlong8    时间: 2011-03-10 10:23
模块是个积累的过程,问题这个 List::Util 是标准模块之一
作者: 超级细菌    时间: 2011-03-25 14:46
  1. #!/usr/bin/perl -w
  2. @color=('梅花','方块','红桃','黑桃');
  3. @number=('A',2..10,'J','Q','K');
  4. foreach $a (@color) {
  5.         foreach $b (@number) {
  6.         push (@c,$a.$b);
  7.         }
  8. }
  9. for ($d=0;$d<10;$d++) {
  10.      $e=(int rand (52))-1;
  11.      print "$c[$e]\n";
  12. }
复制代码
今天突然看到之前发的这个问题,楼上的给的答案没有按照题目要求来,请高手看下我写的这个,我觉得很罗嗦,请指正,谢谢!
作者: xfoucs    时间: 2011-03-25 15:29
今天突然看到之前发的这个问题,楼上的给的答案没有按照题目要求来,请高手看下我写的这个,我觉得很罗嗦, ...
超级细菌 发表于 2011-03-25 14:46



方块J
黑桃2
黑桃J
黑桃2
红桃3
黑桃10
红桃5
黑桃8
红桃K
黑桃2

运行了一次就发现有3个重复的
作者: 2gua    时间: 2011-03-25 15:38
zhlong8
作者: 超级细菌    时间: 2011-03-25 21:05
不是吧?太失望了,{:3_194:}还得再改改
作者: kexinqw    时间: 2011-03-26 11:25
#!/usr/bin/perl -w
@color=qw('方块' '黑桃' '红桃' '梅花');
@sign=qw(A J Q K);
@num=(2..10);
@num1=(@sign,@num);
$i=0;
foreach $color(@color)
{
    foreach $num1(@num1)
   {
            $v[$i]=$color.$num1;
            #print "${v[$i]}\n";
             $i++;
   }
}
$flag=0;
foreach (1..10){
    $rand=rand(52)+1;
    $rand=int($rand);
    if($flag!=$rand)
   {
        print "$v[$rand]\n";
                $flag=$rand;
   }
    else
    {
        $_--;
    }
}
作者: guap514    时间: 2011-03-26 12:09
本帖最后由 guap514 于 2011-03-26 12:14 编辑
  1. @color=('梅花','方块','红桃','黑桃');
  2. @number=('A',2..10,'J','Q','K');
  3. foreach $a (@color) {
  4.     foreach $b (@number) {
  5.         push (@c,$a.$b);
  6.     }
  7. }
  8. #$r = int(rand(52)) and @c[ $_, $r ] = @c[ $r, $_ ] for 0..9;
  9. $r = int(rand(52)) , @c[ $_, $r ] = @c[ $r, $_ ] for 0..9;
  10. print @c[0..9];
复制代码

作者: 心随行    时间: 2017-03-22 12:54
以下是我的实现方法,请指教!


  1. @huase=qw(Mei Fang Hong Hei);
  2. @numbers=('A', 2..10, 'J', 'Q', 'K');
  3. foreach $huase(@huase){                                          #生成52张牌;
  4.         foreach $numbers(@numbers){
  5.                 push @pai,"$huase"."$numbers";
  6.                 }
  7.         }
  8. print "@pai\n";                                      #打印出52张牌;

  9. print "10 randed pai is belowed:\n";

  10. $rand= int rand 52;
  11. push @rand10, $rand;
  12. #$i=0;

  13. #下面这个循环是用来生成10个不重复的52以内的随机整数。
  14. #然后再用这10个整数从52张牌中抽取10张不重复的牌。
  15. OUT: while(1){                                       
  16.         $rand=int rand 52;       
  17.         $geshu=@rand10;
  18.         foreach(@rand10){
  19.                 if ($rand==$_){
  20.                         $i=0;
  21.                         next OUT;
  22.                         }
  23.                 if($rand !=$_){
  24.                         $i++;
  25.                         if($i==$geshu){
  26.                                 push @rand10, $rand;
  27.                                 $geshu=@rand10;
  28.                                 last OUT if $geshu==10;
  29.                                 if ($geshu<10){
  30.                                         $i=0;
  31.                                         next OUT;
  32.                                         }
  33.                                 }
  34.                         }
  35.                 }
  36.         }
  37. print "@rand10","\n";   #打印出这10个不重复的52以内的随机整数。

  38. foreach (@rand10){
  39.         print "$pai[$_]\n";   #打印出这10张不重复的牌。
  40.         }
复制代码



作者: 心随行    时间: 2017-03-22 12:54
以下是我的实现方法,请指教!


  1. @huase=qw(Mei Fang Hong Hei);
  2. @numbers=('A', 2..10, 'J', 'Q', 'K');
  3. foreach $huase(@huase){                                          #生成52张牌;
  4.         foreach $numbers(@numbers){
  5.                 push @pai,"$huase"."$numbers";
  6.                 }
  7.         }
  8. print "@pai\n";                                      #打印出52张牌;

  9. print "10 randed pai is belowed:\n";

  10. $rand= int rand 52;
  11. push @rand10, $rand;
  12. #$i=0;

  13. #下面这个循环是用来生成10个不重复的52以内的随机整数。
  14. #然后再用这10个整数从52张牌中抽取10张不重复的牌。
  15. OUT: while(1){                                       
  16.         $rand=int rand 52;       
  17.         $geshu=@rand10;
  18.         foreach(@rand10){
  19.                 if ($rand==$_){
  20.                         $i=0;
  21.                         next OUT;
  22.                         }
  23.                 if($rand !=$_){
  24.                         $i++;
  25.                         if($i==$geshu){
  26.                                 push @rand10, $rand;
  27.                                 $geshu=@rand10;
  28.                                 last OUT if $geshu==10;
  29.                                 if ($geshu<10){
  30.                                         $i=0;
  31.                                         next OUT;
  32.                                         }
  33.                                 }
  34.                         }
  35.                 }
  36.         }
  37. print "@rand10","\n";   #打印出这10个不重复的52以内的随机整数。

  38. foreach (@rand10){
  39.         print "$pai[$_]\n";   #打印出这10张不重复的牌。
  40.         }
复制代码



作者: 心随行    时间: 2017-03-22 12:55
以下是我的实现方法,请指教!


  1. <div>@huase=qw(Mei Fang Hong Hei);</div><div>@numbers=('A', 2..10, 'J', 'Q', 'K');</div><div>foreach $huase(@huase){  <span class="Apple-tab-span" style="white-space:pre">                                        </span>#生成52张牌;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>foreach $numbers(@numbers){</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>push @pai,"$huase"."$numbers";</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div>print "@pai\n";              <span class="Apple-tab-span" style="white-space:pre">                        </span>#打印出52张牌;</div><div>
  2. </div><div>print "10 randed pai is belowed:\n";</div><div>
  3. </div><div>$rand= int rand 52;</div><div>push @rand10, $rand;</div><div>#$i=0;</div><div>
  4. </div><div>#下面这个循环是用来生成10个不重复的52以内的随机整数。</div><div>#然后再用这10个整数从52张牌中抽取10张不重复的牌。</div><div>OUT: while(1){<span class="Apple-tab-span" style="white-space:pre">                                        </span></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>$rand=int rand 52;<span class="Apple-tab-span" style="white-space:pre">        </span></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>$geshu=@rand10;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>foreach(@rand10){</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if ($rand==$_){</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>$i=0;</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>next OUT;</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if($rand !=$_){</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>$i++;</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>if($i==$geshu){</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>push @rand10, $rand;</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>$geshu=@rand10;</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>last OUT if $geshu==10;</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>if ($geshu<10){</div><div><span class="Apple-tab-span" style="white-space:pre">                                        </span>$i=0;</div><div><span class="Apple-tab-span" style="white-space:pre">                                        </span>next OUT;</div><div><span class="Apple-tab-span" style="white-space:pre">                                        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div>print "@rand10","\n";   #打印出这10个不重复的52以内的随机整数。</div><div>
  5. </div><div>foreach (@rand10){</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>print "$pai[$_]\n";   #打印出这10张不重复的牌。</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div></div>
复制代码



作者: 心随行    时间: 2017-03-22 12:56
以下是我的实现方式,请指教!


  1. @huase=qw(Mei Fang Hong Hei);
  2. @numbers=('A', 2..10, 'J', 'Q', 'K');
  3. foreach $huase(@huase){                                          #生成52张牌;
  4.         foreach $numbers(@numbers){
  5.                 push @pai,"$huase"."$numbers";
  6.                 }
  7.         }
  8. print "@pai\n";                                      #打印出52张牌;

  9. print "10 randed pai is belowed:\n";

  10. $rand= int rand 52;
  11. push @rand10, $rand;
  12. #$i=0;

  13. #下面这个循环是用来生成10个不重复的52以内的随机整数。
  14. #然后再用这10个整数从52张牌中抽取10张不重复的牌。
  15. OUT: while(1){                                       
  16.         $rand=int rand 52;       
  17.         $geshu=@rand10;
  18.         foreach(@rand10){
  19.                 if ($rand==$_){
  20.                         $i=0;
  21.                         next OUT;
  22.                         }
  23.                 if($rand !=$_){
  24.                         $i++;
  25.                         if($i==$geshu){
  26.                                 push @rand10, $rand;
  27.                                 $geshu=@rand10;
  28.                                 last OUT if $geshu==10;
  29.                                 if ($geshu<10){
  30.                                         $i=0;
  31.                                         next OUT;
  32.                                         }
  33.                                 }
  34.                         }
  35.                 }
  36.         }
  37. print "@rand10","\n";   #打印出这10个不重复的52以内的随机整数。

  38. foreach (@rand10){
  39.         print "$pai[$_]\n";   #打印出这10张不重复的牌。
  40.         }
复制代码


作者: 心随行    时间: 2017-03-22 12:56
以下是我的实现方法,请指教!


@huase=qw(Mei Fang Hong Hei);
@numbers=('A', 2..10, 'J', 'Q', 'K');
foreach $huase(@huase){                                          #生成52张牌;
        foreach $numbers(@numbers){
                push @pai,"$huase"."$numbers";
                }
        }
print "@pai\n";                                      #打印出52张牌;

print "10 randed pai is belowed:\n";

$rand= int rand 52;
push @rand10, $rand;
#$i=0;

#下面这个循环是用来生成10个不重复的52以内的随机整数。
#然后再用这10个整数从52张牌中抽取10张不重复的牌。
OUT: while(1){                                       
        $rand=int rand 52;       
        $geshu=@rand10;
        foreach(@rand10){
                if ($rand==$_){
                        $i=0;
                        next OUT;
                        }
                if($rand !=$_){
                        $i++;
                        if($i==$geshu){
                                push @rand10, $rand;
                                $geshu=@rand10;
                                last OUT if $geshu==10;
                                if ($geshu<10){
                                        $i=0;
                                        next OUT;
                                        }
                                }
                        }
                }
        }
print "@rand10","\n";   #打印出这10个不重复的52以内的随机整数。

foreach (@rand10){
        print "$pai[$_]\n";   #打印出这10张不重复的牌。
        }


作者: sunzhiguolu    时间: 2017-03-22 14:24

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use utf8;
  5. use List::Util qw /shuffle/;

  6. sub Builder{
  7.         foreach my $suit ('黑桃', '红心', '梅花', '方块'){
  8.                 foreach my $point ('A', 2 .. 10, 'J', 'Q', 'K'){
  9.                         push (@_, [$suit, $point]);
  10.                 }
  11.         }
  12.         @_;
  13. }

  14. binmode (STDOUT, ':encoding(cp936)');
  15. my @aCards = Builder ();
  16. my @aRand = shuffle (0 .. $#aCards);
  17. my @aTen = splice (@aRand, 0, 10);
  18. print @{$aCards[$_]}, "\n" for @aTen;
复制代码

perl abc.pl
----------------------------
梅花A
梅花8
红心7
黑桃8
红心J
梅花7
梅花3
黑桃7
红心K
梅花6
作者: rubyish    时间: 2017-03-24 01:50
本帖最后由 rubyish 于 2017-03-23 21:53 编辑
  1. #!/usr/bin/perl

  2. sub Card {
  3.     my @map = map {
  4.         my $it = $_;
  5.         map $it . $_, 'A', 2 .. 10, 'J', 'Q', 'K'
  6.     } qw[♠ ♥ ♦ ♣];
  7.     \@map;
  8. }

  9. sub Pick {
  10.     my ( $card, $num ) = @_;
  11.     return [] if $num <= 0;
  12.     my @pick = ( 0 .. $#$card );
  13.     my $it   = @pick;
  14.     $num = $it if $num > $it;

  15.     for my $i ( 0 .. $num - 1 ) {
  16.         my $j = $i + rand $it--;
  17.         @pick[ $i, $j ] = @pick[ $j, $i ];
  18.     }
  19.     [ @$card[ @pick[ 0 .. $num - 1 ] ] ];
  20. }

  21. my $card = Card;
  22. my $pick = Pick $card, 10;
  23. print "@$pick\n";

  24. __DATA__

复制代码


作者: rubyish    时间: 2017-03-24 02:19
perl6
  1. #!perl6

  2. sub Card { <♠ ♥ ♦ ♣> X~ 'A', |(2 .. 10), 'J', 'Q', 'K' }
  3. my @card = Card;
  4. my @pick = @card.pick(10);
  5. say @pick;
复制代码


perl5: sub Card

  1. sub Card { glob '{♠,♥,♦,♣}{A,2,3,4,5,6,7,8,9,10,J,Q,K}' }
复制代码

作者: L_WC    时间: 2017-03-24 10:43
回复 1# 超级细菌

  1. <div>use List::Util 'shuffle';</div><div>use v5.10;</div><div>my @cards = glob '{♥,♠,♦,♣,}{2,3,4,5,6,7,8,9,10,A,J,Q,K}';</div><div>say @{[shuffle @cards]}[0..9];</div>
复制代码




作者: L_WC    时间: 2017-03-24 10:44
本帖最后由 L_WC 于 2017-03-24 10:47 编辑

回复 1# 超级细菌

回复后页面报错了,以为没发成功,结果发重复了,建议站长看看....  参考上一条...

作者: sunzhiguolu    时间: 2017-03-24 11:02
回复 20# L_WC
大师,您这个代码中的这句话 能否帮忙解释下:
my @cards = glob '{♥,♠,♦,♣,}{2,3,4,5,6,7,8,9,10,A,J,Q,K}';

谢谢。


作者: L_WC    时间: 2017-03-24 11:27
回复 22# sunzhiguolu

类似Linux  命令 echo {1,2}{1,2,3} 11 12 13 21 22 23


作者: sunzhiguolu    时间: 2017-03-24 14:32
本帖最后由 sunzhiguolu 于 2017-03-24 14:37 编辑
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use utf8;
  5. use List::Util qw 'shuffle';

  6. sub Builder{
  7.         my @aCards = map {my $suit = $_; map {join ('', $suit, $_)} ('A', 2 .. 10, 'J', 'Q', 'K')}
  8.         qw /黑桃 方块 梅花 红心/;
  9.         [@aCards, 'Joker0', 'Joker1'];
  10. }

  11. binmode (STDOUT, ':encoding(cp936)');

  12. my $raCards = Builder ();
  13. my $n = my $peak = 18;
  14. while ($n >= $peak){
  15.         my @aPos = shuffle (0 .. $#$raCards);
  16.         @{$raCards}[@aPos] = @{$raCards};
  17.         my @aRand = splice (@{$raCards}, 0, $n);
  18.         print join ("\n", @aRand, '', '');
  19.         $n = @{$raCards} if ($n > ($#$raCards + 1));
  20. }
复制代码

perl abc.pl
----------------------------
黑桃2
方块6
方块K
梅花2
红心9
黑桃4
Joker0
红心10
红心K
方块A
红心3
方块2
方块Q
方块5
梅花3
梅花6
方块9
黑桃10

梅花A
方块7
红心5
黑桃8
红心J
黑桃7
黑桃J
黑桃6
红心2
红心A
方块4
黑桃A
方块J
方块10
梅花Q
黑桃3
梅花9
红心8

梅花8
方块3
梅花10
黑桃K
梅花4
黑桃5
红心Q
红心6
方块8
梅花K
红心7
梅花5
红心4
梅花7
黑桃Q
黑桃9
梅花J
Joker1




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2