色んな言語のone-linerで乱数の平均値を計算 [Perl] [misc] [python] [scheme] [プログラム]

| コメント(1) | トラックバック(0)

ネタ元 に触発されて色々one-linerで書いてみた。 お題としては「100万回乱数生成を行いその平均値を計算する」です。

Perl (5.10.1)

perl -MList::Util=sum -E 'say((sum map rand,1..1e6)/1e6)'

List::Util++

Python (2.6.4)

python -c 'import random as r;print sum([r.random() for x in xrange(1000000)])/1e6'

xrange(1e6)だとwarningが出るので、仕方なく若干長めに。

Ruby (1.8.7)

ruby -e 'p 1000000.times.reduce{|r,i|r+rand()}/1e6'

sumはなかったけどreduceが組み込みのおかげでやたらと短い

PHP (5.2.12)

php -r 'function r1($i){return mt_rand()/mt_getrandmax();} echo array_sum(array_map("r1",range(1,1e5)))/1e5;'

見た目も残念な上に 1e6 だと 何故か動かなくて2重に残念な子でした。

Gauche (0.8.13)

gosh -usrfi-1 -E 'print (/. (fold + 0 (map (lambda(x) (/ (sys-random) RAND_MAX)) (iota 1e6))) 1e6)'

久し振りにScheme書いたよ。

トラックバック(0)

トラックバックURL: http://floralcompany.jp/mt/mt-tb.cgi/197

コメント(1)

Rubyだけしかよく分からないのですけど
reduce(inject)は初期値を与えないと
最初の値が初期値として使われますから
今回のような場合だと繰り返しが一回減りますので
より正確には
ruby -e 'p 1000000.times.reduce(0){|r,i|r+rand}/1e6'
とした方がいいのではないでしょうか

他の言語と同じ方針だと
ruby -e 'p (1..1e6).map{rand}.reduce(&:+)/1e6'
とか、ネタ的にすべてメソッドチェーンで書いて
ruby -e '(1..1e6).map{rand}.reduce(&:+).quo(1e6).display'
とか
mapが1M個の配列を実際に生成しちゃうので少しメモリを食いますし
1..1000000だとIntegerでイテレートされるところが、1..1e6だとFloatになるので微妙に遅いですけど

素直に手続き的に複数文で書いた
ruby -e 'r=0;1000000.times{r+=rand};p r/1e6'
の方が速いのがなんとも……

コメントする

AUTHOR

  • turugina (虎王 剱奈)
  • E-mail: turugina {at} floralcompany.jp
  • pixiv
  • ニジエ

2014年5月

        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

アーカイブ

OpenID対応しています OpenIDについて
Powered by Movable Type 5.2.10

- 警 告 -

本サイトにはいわゆる「18禁画像」(イラスト)へのリンクが存在します。 未成年の方や、その手の画像に不快感を覚える方は、 該当記事(「えちぃの」及び「ちょっとえちぃの」カテゴリ) をご覧にならないようお願いいたします。

上記を理解した上で非表示のブログパーツを表示する
あわせて読みたいブログパーツ
ついった
drawr/pixiv/twitpic