#!/usr/bin/perl  
use 5.014 ; use strict ; use warnings ; 
use Getopt::Std ; getopts "1b:g:p:s:" , \my %o ; 
use Term::ANSIColor qw[ :constants color ] ; $Term::ANSIColor::AUTORESET = 1 ; 
use FindBin qw [ $Script ] ;

END{ info () }
$SIG{INT} = sub { exit 130 } ; 
my ( $s1 , $s2 ) = map { eval qq[$_] } split /[,x]/, $o{g} // '6,1' , 2 ; # 行列のように並べるサイズ
$s2 //= 1 ; 
my $n = $o{b} // 1 ; # 二項分布のパラメータで試行の回数
my $p = $o{p} // 0.5 ; # 二項分布のパラメータで、成功確率
my $seed = defined $o{s} ? srand $o{s} : srand ; # 乱数シード

& main ( ) ;
exit 0 ;

sub info ( )  { 
  print STDERR CYAN "Used random seed : $seed ( $Script -s $seed -b $n -g ${s1}x${s2} )\n" unless $o{1} ;
}

sub main ( ) { 
  for ( 1 .. $s1 ) { 
    print join "\t" , map { & binomGen } 1 .. $s2 ; 
    print "\n" ; 
  }
}

sub binomGen (  ) { 
    my $s = 0  ;
    $s +=  rand () < $p for 1 .. $n ;
    return $s ; 
}

## ヘルプの扱い
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 -p rate -n size -g rows,cols

  ベルヌーイ分布もしくは二項分布(binomial distribution)に従う乱数の生成。

 オプション: 
   -b N : 二項分布の試行回数(整数)。未指定なら1(ベルヌーイ分布に従う乱数が生成される)。
   -g N1,N2 : N1行N2列の行列の形で出力。横方向はタブ文字区切り。,の代わりにxの文字でも良い。
   -p N : 二項分布の成功確率(0以上1以下の数)。未指定なら0.5。	
   -s N : 乱数シードの設定。再現性を確保するため。Nの2^32(=約4.3億)による剰余がシードとなる。
   -1   : 2次情報の抑制。通常シード情報などは標準エラー出力で色つきで出力されるがそれを抑制する。

  --help : この $0 のヘルプメッセージを出す。  perldoc -t $0 | cat でもほぼ同じ。
  --help opt : オプションのみのヘルプを出す。opt以外でも options と先頭が1文字以上一致すれば良い。
 
  開発メモ :
      * -g で Infも指定可能としたい。poissonコマンドを参照。ただし、速度比較をせよ。
 =cut
