#!/usr/bin/perl -T use 5.014 ; use strict ; use warnings ; use Getopt::Std ; getopts ':!.:,:1g:m:s:' , \my %o ; use Term::ANSIColor qw[ color :constants ] ; $Term::ANSIColor::AUTORESET = 1 ; sub main () ; sub genPoisson () ; sub info2ndary () ; $| = 1 if $o{'!'} ; $o{m} //= 1 ; # 生æˆã™ã‚‹ãƒã‚¢ã‚½ãƒ³åˆ†å¸ƒã®æ¯å¹³å‡å€¤ $o{g} = do{ $o{g} //= 8 ; int $o{g} } ; # 生æˆã™ã‚‹ä¹±æ•°ã®å€‹æ•° 整数切りæ¨ã¦ã¨ã™ã‚‹ã€‚ $o{s} = defined $o{s} ? srand $o{s} : srand ; # random seed ã®è¨å®šã¨å–å¾— $o{','} = do { $o{','} //= "\t" ; eval qq[qq[$o{','}]] } ; # 出力連番ã¨ã®åŒºåˆ‡ã‚Šæ–‡å— $o{'.'} = do { $o{'.'} //= "\n" ; eval qq[qq[$o{'.'}]] } ; # 出力ã®åŒºåˆ‡ã‚Šæ–‡å— my $c = 0 ; # 乱数ã®ç”Ÿæˆæ¸ˆã¿ã®å€‹æ•° my $explambda = exp -1 * $o{m} ; # 計算上必è¦ã¨ãªã‚‹æ¯å¹³å‡å€¤ã®ã€è‡ªç„¶ã¹ã乗。 my $tsep = $o{','} ; my $osep = $o{'.'} ; die "$0 does not work \nif the number more than 600 is specified for the population average.\n" if $o{m} > 600 ; main () ; info2ndary () ; exit 0 ; sub main () { $SIG{INT} = sub { info2ndary ; exit 130 } ; my $until = $o{g} ; if ( $o{':'} ) { while ( $c++ < $until ) { print $c , $tsep , genPoisson () , $osep } } else { while ( $c ++ < $until ) { print genPoisson () , $osep } } $c -- ; # 調整ã®ãŸã‚ } sub genPoisson () { my $x = -1 ; my $b = 1.0 ; while ( $b >= $explambda ) { $b *= 1 - rand () ; # 区間(0,1]ã®ä¹±æ•°ã‚’生æˆã™ã‚‹ãŸã‚ã€ã‚ãˆã¦1ã‹ã‚‰æ¸›ç®—ã—ãŸã€‚ $x += 1 ; } return $x ; } sub info2ndary () { return if $o{1} ; use FindBin qw [ $Script ] ; my $info = '' ; $info .= color('cyan') . "printed lines: " . color('bright_cyan') . $c ; $info .= color('cyan') . " ; used random seed: " . color('bright_cyan') . $o{s} ; $info .= color('cyan') . " ($Script) " . color('reset') ; print STDERR $info , "\n" ; } ## ヘルプã®æ‰±ã„ sub VERSION_MESSAGE {} sub HELP_MESSAGE { use FindBin qw[ $Script ] ; $ARGV[1] //= '' ; open my $FH , '<' , $0 ; while(<$FH>){ s/\$0/$Script/g ; print $_ if s/^=head1// .. s/^=cut// and $ARGV[1] =~ /^o(p(t(i(o(ns?)?)?)?)?)?$/i ? m/^\s+\-/ : 1; } close $FH ; exit 0 ; } =encoding utf8 =head1 $0 -g 個数 -m å¹³å‡å€¤ ãƒã‚¢ã‚½ãƒ³ä¹±æ•°ã®ç”Ÿæˆ 注æ„: ã“ã®ãƒã‚¢ã‚½ãƒ³ä¹±æ•°ç”Ÿæˆå™¨ã¯ã€è¨ˆç®—時間ãŒæ¯å¹³å‡å€¤ã«ã»ã¼æ¯”例ã™ã‚‹ã€‚ ã¾ãŸã€å†…部ã®è¨ˆç®—ã«ãŠã‘る浮動å°æ•°ç‚¹ãŒexp(-750)ã®å€¤ã¯ã‚¼ãƒã¨ãªã‚‹ã®ã§ã€ 指定ã™ã‚‹æ¯å¹³å‡ã¯600を超ãˆã‚‹ã¨æœ›ã¾ã—ããªã„。 オプション: -g num : 乱数を発生ã•ã›ã‚‹å€‹æ•°ã€‚基本的ã«æ•´æ•°ã‚’指定。Infも指定å¯èƒ½ã€‚ -m num : æ¯å¹³å‡å€¤ã€‚未指定ãªã‚‰ 1.0 。 -s num : 乱数シードã®è¨å®š (基本的ã«10æ¡ä»¥å†…ã®æ•°) -1 : 乱数シードãªã©ã®æƒ…å ±ã‚’å‡ºåŠ›ã—ãªã„。 -: : 行番å·ä»˜ãã§å‡ºåŠ›ã™ã‚‹ã€‚ -. str : 出力ã®åŒºåˆ‡ã‚Šæ–‡å— -, str : 出力番å·ã¨ç”Ÿæˆã—ãŸä¹±æ•°ã®é–“ã®åŒºåˆ‡ã‚Šæ–‡å— --help : ã“ã® $0 ã®ãƒ˜ãƒ«ãƒ—メッセージを出ã™ã€‚ perldoc -t $0 | cat ã§ã‚‚ã»ã¼åŒã˜ã€‚ --help opt : オプションã®ã¿ã®ãƒ˜ãƒ«ãƒ—を出ã™ã€‚opt以外ã§ã‚‚ options ã¨å…ˆé ãŒ1æ–‡å—以上一致ã™ã‚Œã°è‰¯ã„。 開発メモ : * -. 㨠-, ã¯ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã¨ã—ã¦æ”¹è‰¯ã®ä½™åœ°æœ‰ã‚Šã€‚ * while untilã¯ã€ä»–ã®ãƒ—ãƒã‚°ãƒ©ãƒ ã«ã‚‚åŒã˜ã‚ˆã†ã«ã—ãŸã„。 =cut