#/*********************************************************** # rndsamp2.rb -- 無作為抽出 #***********************************************************/ #**** 一様乱数 (線形合同法) ***************************** ULONG_MAX = 4294967295 ULONG_MAX1 = 4294967296 $seed = 1; # 任意 def init_rnd(x) $seed = x end def irnd $seed = ($seed * 1566083941) % ULONG_MAX1 + 1 return $seed end def rnd # 0 <= rnd() < 1 return (1.0 / (ULONG_MAX + 1.0)) * irnd() end #******************************************************** $buf = [] def scanf if $buf == [] s = gets if (s == nil || s == "\n") return nil end $buf = s.scan(/\d+/) end return $buf.shift.to_i end def rndsamp(m, s) n = 0 while ((x = scanf) != nil) if ((n += 1) <= m); s[n - 1] = x.to_i else i = (n * rnd()).to_i if (i < m); s[i] = x.to_i; end end end return n end M = 1000 s = [] init_rnd(Time.new.to_i) $stderr.printf("標準入力から, 標本の大きさと母集団の要素 (整数値)"\ "を読み込み, 標準出力に標本の要素を出力します.\n") if ((m = gets) == nil || m == "\n"); exit 1; end m = m.to_i $stderr.printf("標本の大きさ = %d\n", m) if (m > M) $stderr.printf("標本の大きさは %d 以下でなければなりません\n", M) exit 1 end n = rndsamp(m, s) $stderr.printf("母集団の大きさ = %d\n", n) i = 0; while (i < m && i < n) printf("%8d", s[i]) i += 1 end printf("\n") exit 0