カメヲラボ

主にプログラミングとお勉強全般について書いてます

コードが通る確率(中)

clock()を使う

time(0)は100回に一度くらい通るわけだが、id:kurimuraさんが最初に実証したgetpid()を使う方法から比べると、そうとう確率は低くなる。同じ文字数でもっと確率の高い方法は無いのか調べていたところ、clock()はどうかと思った。これは、実行プログラムが開始してからのCPU時間を返す関数なのだが、こいつはそこそこ精度が悪い(笑)通常30μsなのだが、誤差なのか31μsが返ってくる場合があるのだ。これを利用すれば、clock()&1でtime(0)&1相当の事を実現できる。後はコイツが成功する確率なわけだが、数回程送信してみたところ簡単にAcceptされた。これは使える!!と思ったが、この結果をそのまま信用するのは良くない。今日の早朝、同じように送信してみるとAcceptされるのに100回ほど送信しなければならなかった。もしかしたら、サーバにある程度負荷がかかっている場合に誤差が出やすいのかもしれない。


clock()が最悪100回ほどでAcceptされるとして、time(0)と比べるのとどちらが良いのか。平均送信回数を求めるにはまだまだ回数が足りないのだが、私の1000回以上送信爆撃王(^^;)の感覚で言うと、clock()の方が感触は良い。しかも、clock()を使って通す場合、コンパイラをCにした場合はtime(0)が164k、clock()の場合は20k。gccではどちらも28kで変わらないが、Cで考えた場合はclock()が断然お得である。

fork()は使えるのか

実はwajさんが61byteを叩き出したとき、私はtime(0)の0が、Cでは省略できるのを知らなかったので、「ひょっとしてfork()使えるんちゃうの!?!?」と思ったのだ。早速ローカルマシンでテストしたところ、fork()が常に偶数を返したのでfork()&4として成功した。もう、鼻血でそうやった。


しかし、submitはできなかった・・・。fork()は使用不可だったのだ。今までいろいろ無駄なことをして凹んできたが、疲れきった私にはこれが一番応えた(´ω`)