1: 2012-03-27 (Tue) 21:47:42 SHOO source Edit Backup No.1 as current.
With "vote" plugin. at 2012-09-17 (月) 23:00:25
Line 1: Line 1:
 +TITLE:確率的にコンパイルを失敗させる
 +* はじめに [#a30f02b9]
 +CTFEによるコンパイル時乱数を使って確率的にコンパイルを失敗させることができそうだったので、やってみました。
 +CTFEに関しては、[[SampleCodes/D言語文法/コンパイル時実行関連/1]]を参照してください。
 +
 +* 方針 [#ce116a70]
 ++ __DATE__と__TIME__を組み合わせた文字列から乱数のseedを作る
 ++ 乱数を作る
 ++ 乱数の値に応じて static assert(false) する。
 +
 +これで行けそうな気がします。
 +
 +* 実際に書いてみる [#raa08d24]
 +#code(d){{{
 +bool isSuccess(){
 +   import std.random;
 +   Mt19937 gen;
 +   string str = __DATE__ ~ __TIME__;
 +   uint hash;
 +   foreach (c; str){
 +       hash = (hash * 9) + c;
 +   }
 +   gen.seed(hash);
 +   return uniform(0, 2, gen) == 0;
 +}
 +
 +static assert(isSuccess(), "Somehow compilation failed.");
 +
 +void main(){}
 +}}}
 +
 +こんな感じで大丈夫そうです。
 +
 +見れば分かりますが、10行目のuniformの第二引数を大きくすれば、コンパイル成功確率が減ります。
 +
 +このコードのコンパイル成功確率は1/2になっています。
 +
 +seedになるhashの取得は適当にやってますが、多少seedが連続してても、メルセンヌツイスターなので多分大丈夫でしょう。
 +
 +* 動かしてみる [#d0401f0d]
 +#code(console){{{
 +Error: static assert  "Somehow compilation failed."
 +}}}
 +
 +と表示されてコンパイルが失敗したり、普通に成功したりします。
 +
 +良い感じに失敗するときは失敗してくれます。
 +
 +* 展望 [#fff64b76]
 +無いです。ネタですからね。
 +
 +* 投票とコメント [#i21a3865]
 +#vote(#lastvote:12cdd1338e3eb5a7ec9cbde998526f91,大変参考になった[6],参考になった,あまり参考にならなかった,まったく参考にならなかった,#notimestamp)
 +#pcomment


Front page   Edit Diff Backup Upload Copy Rename ReloadPrint View   New Page Page list Search Recent changes   Help   RSS of recent changes (RSS 1.0) RSS of recent changes (RSS 2.0) RSS of recent changes (RSS Atom) Powered by xpWiki
Counter: 6175, today: 1, yesterday: 0
メインメニュー

ログイン

ユーザー名:


パスワード:





パスワード紛失  |新規登録

Menu